[ACS-5761] Demo Shell Cleanup (part 2) (#8807)

cleanup demo shell
This commit is contained in:
Denys Vuika 2023-08-10 22:18:21 +01:00 committed by GitHub
parent ca60b392d4
commit f201efd56a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
203 changed files with 1005 additions and 10703 deletions

View File

@ -1,39 +0,0 @@
{
"title": "مرحبًا",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "تم تعيين المهمة {{taskName}} إلى {{assignee}}",
"PROCESS_STARTED": "تم بدء عملية {{processName}}",
"TASK_UPDATED": "تم تحديث تفاصيل مهمة {{taskName}}",
"TASK_CREATED": "تم إنشاء المهمة {{TaskName}}"
},
"SEARCH": {
"RESULTS": "نتائج البحث",
"NO_RESULT": "لم يتم العثور على نتائج",
"FACET_FIELDS": {
"TYPE": "1:النوع",
"SIZE": "2:الحجم",
"CREATOR": "3:المُنشئ",
"MODIFIER": "4:المُعدل",
"CREATED": "5:تم الإنشاء"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "استعلامات واجهتي",
"CREATED_THIS_YEAR": "1.تم الإنشاء هذا العام",
"MIMETYPE": "2.النوع: HTML",
"XTRASMALL": "3.الحجم: فائق الصغر",
"SMALL": "4.الحجم: صغير",
"MEDIUM": "5.الحجم: متوسط",
"LARGE": "6.الحجم: كبير",
"XTRALARGE": "7.الحجم: فائق الكبر",
"XXTRALARGE": "8.الحجم: كبير XX"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "الترجمة الأولى للعنوان المخصص",
"GROUP-TITLE2-TRANSLATION-KEY": "الترجمة الثانية للعنوان المخصص",
"ERROR_CONTENT": {
"507": {
"TITLE": "قرص ACS ممتلئ",
"DESCRIPTION": "يتجاوز المحتوى حد سعة التخزين المكون للشبكة أو النظام"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Vítejte",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "Úkol {{taskName}} byl přiřazen uživateli {{assignee}}",
"PROCESS_STARTED": "Byl spuštěn proces {{processName}}",
"TASK_UPDATED": "Byly aktualizovány podrobnosti úkolu {{taskName}}",
"TASK_CREATED": "Úkol {{taskName}} byl vytvořen"
},
"SEARCH": {
"RESULTS": "Výsledky hledání",
"NO_RESULT": "Nebyly nalezeny žádné výsledky",
"FACET_FIELDS": {
"TYPE": "1:Typ",
"SIZE": "2:Velikost",
"CREATOR": "3:Autor",
"MODIFIER": "4:Upravil(a)",
"CREATED": "5:Vytvořeno"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Moje dotazy na aspekty",
"CREATED_THIS_YEAR": "1.Vytvořeno tento rok",
"MIMETYPE": "2.Typ: HTML",
"XTRASMALL": "3.Velikost: extra malé",
"SMALL": "4.Velikost: malé",
"MEDIUM": "5.Velikost: střední",
"LARGE": "6.Velikost: velké",
"XTRALARGE": "7.Velikost: extra velké",
"XXTRALARGE": "8.Velikost: XX velké"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Vlastní překlad názvu 1",
"GROUP-TITLE2-TRANSLATION-KEY": "Vlastní překlad názvu 2",
"ERROR_CONTENT": {
"507": {
"TITLE": "Disk ACS plný",
"DESCRIPTION": "Obsah přesahuje celkovou kvótu úložiště nastavenou pro síť nebo systém"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Velkommen",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "{{taskName}} opgave er blevet tildelt til {{assignee}}",
"PROCESS_STARTED": "{{processName}} processen er startet",
"TASK_UPDATED": "{{taskName}} opgavedetaljer er blevet opdateret",
"TASK_CREATED": "Opgaven {{taskName}} blev oprettet"
},
"SEARCH": {
"RESULTS": "Søgeresultater",
"NO_RESULT": "Der blev ikke fundet nogen resultater",
"FACET_FIELDS": {
"TYPE": "1: Type",
"SIZE": "2: Størrelse",
"CREATOR": "3: Opretter",
"MODIFIER": "4: Modifikator",
"CREATED": "5: Oprettet"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Mine facetforespørgsler",
"CREATED_THIS_YEAR": "1. Oprettet i år",
"MIMETYPE": "2. Type: HTML",
"XTRASMALL": "3. Størrelse: xtra small",
"SMALL": "4. Størrelse: small",
"MEDIUM": "5. Størrelse: medium",
"LARGE": "6. Størrelse: large",
"XTRALARGE": "7. Størrelse: xtra large",
"XXTRALARGE": "8. Størrelse: XX large"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Brugerdefineret titel oversættelse et",
"GROUP-TITLE2-TRANSLATION-KEY": "Brugerdefineret titel oversættelse to",
"ERROR_CONTENT": {
"507": {
"TITLE": "ACS-disken er fuld",
"DESCRIPTION": "Indholdet overskrider den generelle lagerkvotegrænse, der er konfigureret for netværket eller systemet"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Willkommen",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "Aufgabe '{{taskName}}' wurde {{assignee}} zugewiesen",
"PROCESS_STARTED": "Prozess '{{processName}}' wurde gestartet",
"TASK_UPDATED": "Aufgabe '{{taskName}}' wurde aktualisiert",
"TASK_CREATED": "Die Aufgabe {{taskName}} wurde erstellt"
},
"SEARCH": {
"RESULTS": "Ergebnisse durchsuchen",
"NO_RESULT": "Keine Ergebnisse gefunden",
"FACET_FIELDS": {
"TYPE": "1:Typ",
"SIZE": "2:Größe",
"CREATOR": "3:Erstellt von",
"MODIFIER": "4:Bearbeitet von",
"CREATED": "5:Erstellt am"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Meine Facet-Abfragen",
"CREATED_THIS_YEAR": "1.Dieses Jahr erstellt",
"MIMETYPE": "2.Typ: HTML",
"XTRASMALL": "3.Größe: sehr klein",
"SMALL": "4.Größe: klein",
"MEDIUM": "5.Größe: mittel",
"LARGE": "6.Größe: groß",
"XTRALARGE": "7.Größe: sehr groß",
"XXTRALARGE": "8.Größe: extrem groß"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Übersetzung benutzerdefinierter Titel 1",
"GROUP-TITLE2-TRANSLATION-KEY": "Übersetzung benutzerdefinierter Titel 2",
"ERROR_CONTENT": {
"507": {
"TITLE": "ACS-Datenträger voll",
"DESCRIPTION": "Inhalt übersteigt die für das Netzwerk oder System konfigurierte Gesamtspeicherbegrenzung"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Bienvenido",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "La tarea {{taskName}} ha sido asignada a {{assignee}}",
"PROCESS_STARTED": "Se ha iniciado el proceso {{processName}}",
"TASK_UPDATED": "Se actualizaron los detalles de la tarea {{taskName}}",
"TASK_CREATED": "Se ha creado la tarea {{taskName}}"
},
"SEARCH": {
"RESULTS": "Resultados de la búsqueda",
"NO_RESULT": "Ningún resultado encontrado",
"FACET_FIELDS": {
"TYPE": "1:Tipo",
"SIZE": "2:Tamaño",
"CREATOR": "3:Creador",
"MODIFIER": "4:Modificador",
"CREATED": "5:Creados"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Mis consultas por filtros",
"CREATED_THIS_YEAR": "1.Creadas este año",
"MIMETYPE": "2.Tipo: HTML",
"XTRASMALL": "3.Tamaño: extrapequeño",
"SMALL": "4.Tamaño: pequeño",
"MEDIUM": "5.Tamaño: mediano",
"LARGE": "6.Tamaño: grande",
"XTRALARGE": "7.Tamaño: extragrande",
"XXTRALARGE": "8.Tamaño: extraextragrande"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Traducción de título personalizado 1",
"GROUP-TITLE2-TRANSLATION-KEY": "Traducción de título personalizado 2",
"ERROR_CONTENT": {
"507": {
"TITLE": "Disco ACS lleno",
"DESCRIPTION": "El contenido supera el límite de la cuota de almacenamiento general configurado para la red o sistema."
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Tervetuloa",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "{{taskName}} -tehtävä on määritetty käyttäjälle {{assignee}}",
"PROCESS_STARTED": "{{processName}} -prosessi on käynnistetty",
"TASK_UPDATED": "{{taskName}} -tehtävän tiedot on päivitetty",
"TASK_CREATED": "{{taskName}} -tehtävä luotiin"
},
"SEARCH": {
"RESULTS": "Hakutulokset",
"NO_RESULT": "Tuloksia ei löydy",
"FACET_FIELDS": {
"TYPE": "1: tyyppi",
"SIZE": "2: koko",
"CREATOR": "3: tekijä",
"MODIFIER": "4: muokkaaja",
"CREATED": "5: luotu"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Omat kyselyt",
"CREATED_THIS_YEAR": "1. Luotu tänä vuonna",
"MIMETYPE": "2. Tyyppi: HTML",
"XTRASMALL": "3. Koko: XS",
"SMALL": "4. Koko: S",
"MEDIUM": "5. Koko: M",
"LARGE": "6. Koko: L",
"XTRALARGE": "7. Koko: XL",
"XXTRALARGE": "8. Koko: XXL"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Oma otsikkokäännös yksi",
"GROUP-TITLE2-TRANSLATION-KEY": "Oma otsikkokäännös kaksi",
"ERROR_CONTENT": {
"507": {
"TITLE": "ACS-levy täynnä",
"DESCRIPTION": "Sisältö ylittää verkolle tai järjestelmälle määritetyn tallennustilan kokonaisrajoituksen"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Bienvenue",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "La tâche {{taskName}} a été assignée à {{assignee}}",
"PROCESS_STARTED": "Le processus {{processName}} a été démarré",
"TASK_UPDATED": "Les détails de la tâche {{taskName}} ont été mis à jour",
"TASK_CREATED": "{{taskName}} tâche a été créée"
},
"SEARCH": {
"RESULTS": "Résultats de la recherche",
"NO_RESULT": "Aucun résultat trouvé",
"FACET_FIELDS": {
"TYPE": "1:Type",
"SIZE": "2:Taille",
"CREATOR": "3:Créateur",
"MODIFIER": "4:Modificateur",
"CREATED": "5:Créé"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Mes recherches avec filtre",
"CREATED_THIS_YEAR": "1.Créé cette année",
"MIMETYPE": "2.Type : HTML",
"XTRASMALL": "3.Taille : très petit",
"SMALL": "4.Taille : petit",
"MEDIUM": "5.Taille : moyen",
"LARGE": "6.Taille : gros",
"XTRALARGE": "7.Taille : très gros",
"XXTRALARGE": "8.Taille : énorme"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Titre personnalisé traduction un",
"GROUP-TITLE2-TRANSLATION-KEY": "Titre personnalisé traduction deux",
"ERROR_CONTENT": {
"507": {
"TITLE": "Disque ACS plein",
"DESCRIPTION": "Le contenu dépasse le quota maximum de stockage configuré pour le réseau ou système"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Benvenuto",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "Il compito {{taskName}} è stato assegnato a {{assignee}}",
"PROCESS_STARTED": "Il processo {{processName}} è stato avviato",
"TASK_UPDATED": "I dettagli del compito {{taskName}} sono stati aggiornati",
"TASK_CREATED": "Il compito {{taskName}} è stato creato"
},
"SEARCH": {
"RESULTS": "Risultati della ricerca",
"NO_RESULT": "Nessun risultato trovato",
"FACET_FIELDS": {
"TYPE": "1. Tipo",
"SIZE": "2. Dimensioni",
"CREATOR": "3. Autore",
"MODIFIER": "4. Modificatore",
"CREATED": "5. Creati"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Le mie query filtri",
"CREATED_THIS_YEAR": "1. Creati quest'anno",
"MIMETYPE": "2.Tipo: HTML",
"XTRASMALL": "3. Dimensioni: extra piccolo",
"SMALL": "4. Dimensioni: piccolo",
"MEDIUM": "5. Dimensioni: medio",
"LARGE": "6. Dimensioni: grande",
"XTRALARGE": "7. Dimensioni: extra grande",
"XXTRALARGE": "8. Dimensioni: extra extra grande"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Custom Title Translation One",
"GROUP-TITLE2-TRANSLATION-KEY": "Custom Title Translation Two",
"ERROR_CONTENT": {
"507": {
"TITLE": "Dico ACS pieno",
"DESCRIPTION": "Il contenuto supera il limite di archiviazione complessivo configurato per la rete o il sistema"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "ようこそ",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "{{taskName}}タスクが{{assignee}}に割り当てられました",
"PROCESS_STARTED": "{{processName}}プロセスが開始しました",
"TASK_UPDATED": "{{taskName}}タスクの詳細が更新されました",
"TASK_CREATED": "{{taskName}}タスクが作成されました"
},
"SEARCH": {
"RESULTS": "検索結果",
"NO_RESULT": "一致するアイテムはありません",
"FACET_FIELDS": {
"TYPE": "1:タイプ",
"SIZE": "2:サイズ",
"CREATOR": "3:作成者",
"MODIFIER": "4:変更者",
"CREATED": "5:作成日"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "あなたのファセットクエリ",
"CREATED_THIS_YEAR": "1.今年作成",
"MIMETYPE": "2.タイプ: HTML",
"XTRASMALL": "3.サイズ: 極小",
"SMALL": "4.サイズ: 小",
"MEDIUM": "5.サイズ: 中",
"LARGE": "6.サイズ: 大",
"XTRALARGE": "7.サイズ: 特大",
"XXTRALARGE": "8.サイズ: 超特大"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "カスタムのタイトル翻訳 1",
"GROUP-TITLE2-TRANSLATION-KEY": "カスタムのタイトル翻訳 2",
"ERROR_CONTENT": {
"507": {
"TITLE": "ACS のディスクがいっぱいです",
"DESCRIPTION": "コンテンツのサイズが、ネットワークまたはシステムに設定されているストレージクォータの上限を超えています。"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Velkommen",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "{{taskName}}-oppgaven er tilordnet til {{assignee}}",
"PROCESS_STARTED": "{{processName}}-prosessen er startet",
"TASK_UPDATED": "{{taskName}}-oppgavedetaljene er oppdatert",
"TASK_CREATED": "Oppgaven {{taskName}} ble opprettet"
},
"SEARCH": {
"RESULTS": "Søkeresultater",
"NO_RESULT": "Ingen resultater funnet",
"FACET_FIELDS": {
"TYPE": "1:Type",
"SIZE": "2:Størrelse",
"CREATOR": "3:Oppretter",
"MODIFIER": "4:Modifikator",
"CREATED": "5:Opprettet"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Mine egenskapsspørringer",
"CREATED_THIS_YEAR": "1.Opprettet i år",
"MIMETYPE": "2.Type: HTML",
"XTRASMALL": "3.Størrelse: xtra small",
"SMALL": "4.Størrelse: small",
"MEDIUM": "5.Størrelse: medium",
"LARGE": "6.Størrelse: large",
"XTRALARGE": "7.Størrelse: xtra large",
"XXTRALARGE": "8.Størrelse: XX large"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Egendefinert tittel, oversettelse én",
"GROUP-TITLE2-TRANSLATION-KEY": "Egendefinert tittel, oversettelse to",
"ERROR_CONTENT": {
"507": {
"TITLE": "ACS-disk er full",
"DESCRIPTION": "Innhold overgår samlet lagringskvotegrense konfigurert for nettverket eller systemet"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Welkom",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "{{taskName}}-taak is toegewezen aan {{assignee}}",
"PROCESS_STARTED": "{{processName}}-proces is gestart",
"TASK_UPDATED": "{{taskName}}-taakdetails zijn bijgewerkt",
"TASK_CREATED": "Taak {{taskName}} is gemaakt"
},
"SEARCH": {
"RESULTS": "Zoekresultaten",
"NO_RESULT": "Geen resultaten gevonden",
"FACET_FIELDS": {
"TYPE": "1:Type",
"SIZE": "2:Grootte",
"CREATOR": "3:Maker",
"MODIFIER": "4:Gewijzigd door",
"CREATED": "5:Gemaakt"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Mijn facetquery's",
"CREATED_THIS_YEAR": "1.Dit jaar gemaakt",
"MIMETYPE": "2.Type: HTML",
"XTRASMALL": "3.Grootte: extra klein",
"SMALL": "4.Grootte: klein",
"MEDIUM": "5.Grootte: middelgroot",
"LARGE": "6.Grootte: groot",
"XTRALARGE": "7.Grootte: extra groot",
"XXTRALARGE": "8.Grootte: XX groot"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Aangepaste titel vertaling één",
"GROUP-TITLE2-TRANSLATION-KEY": "Aangepaste titel vertaling twee",
"ERROR_CONTENT": {
"507": {
"TITLE": "ACS-schijf vol",
"DESCRIPTION": "Content overschrijdt de totale opslaglimiet die is geconfigureerd voor het netwerk of systeem"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Witaj",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "Zadanie {{taskName}} zostało przydzielone do {{assignee}}",
"PROCESS_STARTED": "Proces {{processName}} został uruchomiony",
"TASK_UPDATED": "Szczegóły zadania {{taskName}} zostały zaktualizowane",
"TASK_CREATED": "Zadanie {{taskName}} zostało utworzone"
},
"SEARCH": {
"RESULTS": "Wyniki wyszukiwania",
"NO_RESULT": "Brak wyników",
"FACET_FIELDS": {
"TYPE": "1: Typ",
"SIZE": "2: Rozmiar",
"CREATOR": "3: Twórca",
"MODIFIER": "4: Modyfikator",
"CREATED": "5: Utworzono"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Moje zapytania dotyczące aspektu",
"CREATED_THIS_YEAR": "1. Utworzone w tym roku",
"MIMETYPE": "2. Typ: HTML",
"XTRASMALL": "3. Rozmiar: bardzo mały",
"SMALL": "4. Rozmiar: mały",
"MEDIUM": "5. Rozmiar: średni",
"LARGE": "6. Rozmiar: duży",
"XTRALARGE": "7. Rozmiar: bardzo duży",
"XXTRALARGE": "8. Rozmiar: wyjątkowo duży"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Tytuł niestandardowy — tłumaczenie pierwsze",
"GROUP-TITLE2-TRANSLATION-KEY": "Tytuł niestandardowy — tłumaczenie drugie",
"ERROR_CONTENT": {
"507": {
"TITLE": "Dysk ACS pełny",
"DESCRIPTION": "Zawartość przekracza limit łącznego przydziału miejsca w magazynie skonfigurowany w sieci lub systemie"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Bem-vindo",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "A tarefa {{taskName}} foi atribuída a {{assignee}}",
"PROCESS_STARTED": "O processo {{processName}} foi iniciado",
"TASK_UPDATED": "Os detalhes da tarefa {{taskName}} foram atualizados",
"TASK_CREATED": "A tarefa {{taskName}} foi criada"
},
"SEARCH": {
"RESULTS": "Resultados da pesquisa",
"NO_RESULT": "Nenhum resultado encontrado",
"FACET_FIELDS": {
"TYPE": "1:Tipo",
"SIZE": "2:Tamanho",
"CREATOR": "3:Criador",
"MODIFIER": "4:Modificador",
"CREATED": "5:Criado"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Minhas consultas de faceta",
"CREATED_THIS_YEAR": "1.Criado este ano",
"MIMETYPE": "2.Tipo: HTML",
"XTRASMALL": "3.Tamanho: muito pequeno",
"SMALL": "4.Tamanho: pequeno",
"MEDIUM": "5.Tamanho: médio",
"LARGE": "6.Tamanho: grande",
"XTRALARGE": "7.Tamanho: muito grande",
"XXTRALARGE": "8.Tamanho: extragrande"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Tradução um de título personalizado",
"GROUP-TITLE2-TRANSLATION-KEY": "Tradução dois de título personalizado",
"ERROR_CONTENT": {
"507": {
"TITLE": "Disco ACS cheio",
"DESCRIPTION": "O conteúdo excede o limite de armazenamento geral configurado para a rede ou o sistema"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Добро пожаловать",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "Задача {{taskName}} была назначена {{assignee}}",
"PROCESS_STARTED": "Процесс {{processName}} запущен",
"TASK_UPDATED": "Сведения о задаче {{taskName}} обновлены",
"TASK_CREATED": "{{taskName}} задача создана"
},
"SEARCH": {
"RESULTS": "Результаты поиска",
"NO_RESULT": "Результаты не найдены",
"FACET_FIELDS": {
"TYPE": "1: тип",
"SIZE": "2: размер",
"CREATOR": "3: автор",
"MODIFIER": "4: редактор",
"CREATED": "5: создано"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Мои фасетные запросы",
"CREATED_THIS_YEAR": "1. Создано в этом году",
"MIMETYPE": "2. Тип HTML",
"XTRASMALL": "3. Размер: крайне малый",
"SMALL": "4. Размер: малый",
"MEDIUM": "5. Размер: средний",
"LARGE": "6. Размер: большой",
"XTRALARGE": "7. Размер: очень большой",
"XXTRALARGE": "8. Размер: огромный"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Перевод пользовательского заголовка один",
"GROUP-TITLE2-TRANSLATION-KEY": "Перевод пользовательского заголовка два",
"ERROR_CONTENT": {
"507": {
"TITLE": "Диск ACS заполнен",
"DESCRIPTION": "Объем данных превысил максимально допустимое значение, установленное для сети или системы"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "Välkommen",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "{{taskName}} uppgiften har tilldelats till {{assignee}}",
"PROCESS_STARTED": "{{processName}} processen har startats",
"TASK_UPDATED": "{{taskName}} uppgiftsinformation har uppdaterats",
"TASK_CREATED": "Uppgiften {{taskName}} skapades"
},
"SEARCH": {
"RESULTS": "Sökresultat",
"NO_RESULT": "Inga resultat hittades",
"FACET_FIELDS": {
"TYPE": "1:Typ",
"SIZE": "2:Storlek",
"CREATOR": "3:Skapad av",
"MODIFIER": "4:Ändrad av",
"CREATED": "5:Skapad den"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "Mina fasettförfrågningar",
"CREATED_THIS_YEAR": "1.Skapad det här året",
"MIMETYPE": "2.Typ: HTML",
"XTRASMALL": "3.Storlek: extra small",
"SMALL": "4.Storlek: small",
"MEDIUM": "5.Storlek: medium",
"LARGE": "6.Storlek: large",
"XTRALARGE": "7.Storlek: extra large",
"XXTRALARGE": "8.Storlek: XX large"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "Anpassad titelöversättning ett",
"GROUP-TITLE2-TRANSLATION-KEY": "Anpassad titelöversättning två",
"ERROR_CONTENT": {
"507": {
"TITLE": "ACS disk full",
"DESCRIPTION": "Innehållet överskrider övergripande kvotbegränsning som är konfigurerad för nätverket eller systemet"
}
}
}

View File

@ -1,39 +0,0 @@
{
"title": "欢迎使用",
"NOTIFICATIONS": {
"TASK_ASSIGNED": "{{taskName}} 任务已分配给 {{assignee}}",
"PROCESS_STARTED": "{{processName}} 进程已启动",
"TASK_UPDATED": "{{taskName}} 任务详细信息已更新",
"TASK_CREATED": "{{taskName}} 任务已创建"
},
"SEARCH": {
"RESULTS": "搜索结果",
"NO_RESULT": "未找到结果",
"FACET_FIELDS": {
"TYPE": "1类型",
"SIZE": "2字号",
"CREATOR": "3创建者",
"MODIFIER": "4修改者",
"CREATED": "5已创建"
},
"FACET_QUERIES": {
"MY_FACET_QUERIES": "我的分面查询",
"CREATED_THIS_YEAR": "1. 今年创建",
"MIMETYPE": "2. 类型: HTML",
"XTRASMALL": "3. 字号:超小",
"SMALL": "4. 字号:小",
"MEDIUM": "5. 字号:中等",
"LARGE": "6. 字号:大",
"XTRALARGE": "7. 字号:特大",
"XXTRALARGE": "8. 字号:超大"
}
},
"GROUP-TITLE1-TRANSLATION-KEY": "自定义标题翻译 1",
"GROUP-TITLE2-TRANSLATION-KEY": "自定义标题翻译 2",
"ERROR_CONTENT": {
"507": {
"TITLE": "ACS 磁盘已满",
"DESCRIPTION": "内容超出为网络或系统配置的总存储配额限制"
}
}
}

View File

@ -16,7 +16,7 @@
*/
import { BrowserModule } from '@angular/platform-browser';
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { NgChartsModule } from 'ng2-charts';
import { HttpClientModule } from '@angular/common/http';
@ -39,8 +39,6 @@ import { HomeComponent } from './components/home/home.component';
import { SearchBarComponent } from './components/search/search-bar.component';
import { SearchResultComponent } from './components/search/search-result.component';
import { FormComponent } from './components/form/form.component';
import { FormListComponent } from './components/form/form-list.component';
import { FormLoadingComponent } from './components/form/form-loading.component';
import { ProcessServiceComponent } from './components/process-service/process-service.component';
import { ShowDiagramComponent } from './components/process-service/show-diagram.component';
import { FormViewerComponent } from './components/process-service/form-viewer.component';
@ -52,7 +50,6 @@ import { MetadataDialogAdapterComponent } from './components/files/metadata-dial
import { appRoutes } from './app.routes';
import { TaskAttachmentsComponent } from './components/process-service/task-attachments.component';
import { ProcessAttachmentsComponent } from './components/process-service/process-attachments.component';
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
import { DemoPermissionComponent } from './components/permissions/demo-permissions.component';
import { MonacoEditorModule } from 'ngx-monaco-editor-v2';
import { ContentModule } from '@alfresco/adf-content-services';
@ -64,15 +61,12 @@ import { AppsCloudDemoComponent } from './components/cloud/apps-cloud-demo.compo
import { TasksCloudDemoComponent } from './components/cloud/tasks-cloud-demo.component';
import { ProcessesCloudDemoComponent } from './components/cloud/processes-cloud-demo.component';
import { TaskDetailsCloudDemoComponent } from './components/cloud/task-details-cloud-demo.component';
import { TaskHeaderCloudDemoComponent } from './components/cloud/task-header-cloud-demo.component';
import { ServiceTaskListCloudDemoComponent } from './components/cloud/service-task-list-cloud-demo.component';
import { CloudViewerComponent } from './components/cloud/cloud-viewer.component';
import { ProcessDetailsCloudDemoComponent } from './components/cloud/process-details-cloud-demo.component';
import { StartTaskCloudDemoComponent } from './components/cloud/start-task-cloud-demo.component';
import { StartProcessCloudDemoComponent } from './components/cloud/start-process-cloud-demo.component';
import { CloudBreadcrumbsComponent } from './components/cloud/cloud-breadcrumb-component';
import { CloudFiltersDemoComponent } from './components/cloud/cloud-filters-demo.component';
import { PeopleGroupCloudDemoComponent } from './components/cloud/people-groups-cloud-demo.component';
import { FormCloudDemoComponent } from './components/app-layout/cloud/form-demo/cloud-form-demo.component';
import { environment } from '../environments/environment';
import { AppCloudSharedModule } from './components/cloud/shared/cloud.shared.module';
@ -81,46 +75,9 @@ import { ProcessServicesCloudModule } from '@alfresco/adf-process-services-cloud
import { RouterModule } from '@angular/router';
import { ProcessCloudLayoutComponent } from './components/cloud/process-cloud-layout.component';
import { CustomEditorComponent, CustomWidgetComponent } from './components/cloud/custom-form-components/custom-editor.component';
import { registerLocaleData } from '@angular/common';
import localeFr from '@angular/common/locales/fr';
import localeDe from '@angular/common/locales/de';
import localeIt from '@angular/common/locales/it';
import localeEs from '@angular/common/locales/es';
import localeJa from '@angular/common/locales/ja';
import localeNl from '@angular/common/locales/nl';
import localePt from '@angular/common/locales/pt';
import localeNb from '@angular/common/locales/nb';
import localeRu from '@angular/common/locales/ru';
import localeCh from '@angular/common/locales/zh';
import localeAr from '@angular/common/locales/ar';
import localeCs from '@angular/common/locales/cs';
import localePl from '@angular/common/locales/pl';
import localeFi from '@angular/common/locales/fi';
import localeDa from '@angular/common/locales/da';
import localeSv from '@angular/common/locales/sv';
import { setupAppNotifications } from './services/app-notifications-factory';
import { AppNotificationsService } from './services/app-notifications.service';
import { SearchFilterChipsComponent } from './components/search/search-filter-chips.component';
import { UserInfoComponent } from './components/app-layout/user-info/user-info.component';
registerLocaleData(localeFr);
registerLocaleData(localeDe);
registerLocaleData(localeIt);
registerLocaleData(localeEs);
registerLocaleData(localeJa);
registerLocaleData(localeNl);
registerLocaleData(localePt);
registerLocaleData(localeNb);
registerLocaleData(localeRu);
registerLocaleData(localeCh);
registerLocaleData(localeAr);
registerLocaleData(localeCs);
registerLocaleData(localePl);
registerLocaleData(localeFi);
registerLocaleData(localeDa);
registerLocaleData(localeSv);
@NgModule({
imports: [
BrowserModule,
@ -157,47 +114,33 @@ registerLocaleData(localeSv);
AppsViewComponent,
FilesComponent,
FormComponent,
FormListComponent,
VersionManagerDialogAdapterComponent,
MetadataDialogAdapterComponent,
TaskAttachmentsComponent,
ProcessAttachmentsComponent,
SharedLinkViewComponent,
FormLoadingComponent,
DemoPermissionComponent,
DemoErrorComponent,
FormLoadingComponent,
TreeViewSampleComponent,
CloudLayoutComponent,
AppsCloudDemoComponent,
TasksCloudDemoComponent,
ProcessesCloudDemoComponent,
TaskDetailsCloudDemoComponent,
TaskHeaderCloudDemoComponent,
CloudViewerComponent,
ProcessDetailsCloudDemoComponent,
StartTaskCloudDemoComponent,
StartProcessCloudDemoComponent,
CloudBreadcrumbsComponent,
CloudFiltersDemoComponent,
PeopleGroupCloudDemoComponent,
FormCloudDemoComponent,
CustomEditorComponent,
CustomWidgetComponent,
ProcessCloudLayoutComponent,
ServiceTaskListCloudDemoComponent,
SearchFilterChipsComponent
],
providers: [
{ provide: AppConfigService, useClass: DebugAppConfigService }, // not use this service in production
provideTranslations('app', 'resources'),
AppNotificationsService,
{
provide: APP_INITIALIZER,
useFactory: setupAppNotifications,
deps: [AppNotificationsService],
multi: true
}
provideTranslations('app', 'resources')
],
bootstrap: [AppComponent]
})

View File

@ -28,14 +28,10 @@ import { AppsViewComponent } from './components/process-service/apps-view.compon
import { SearchResultComponent } from './components/search/search-result.component';
import { FilesComponent } from './components/files/files.component';
import { FormComponent } from './components/form/form.component';
import { FormListComponent } from './components/form/form-list.component';
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
import { FormLoadingComponent } from './components/form/form-loading.component';
import { DemoPermissionComponent } from './components/permissions/demo-permissions.component';
import { AppComponent } from './app.component';
import { TreeViewSampleComponent } from './components/tree-view/tree-view-sample.component';
import { AppsCloudDemoComponent } from './components/cloud/apps-cloud-demo.component';
import { PeopleGroupCloudDemoComponent } from './components/cloud/people-groups-cloud-demo.component';
import { CloudLayoutComponent } from './components/cloud/cloud-layout.component';
import { TasksCloudDemoComponent } from './components/cloud/tasks-cloud-demo.component';
import { ProcessesCloudDemoComponent } from './components/cloud/processes-cloud-demo.component';
@ -46,9 +42,7 @@ import { CloudViewerComponent } from './components/cloud/cloud-viewer.component'
import { ProcessDetailsCloudDemoComponent } from './components/cloud/process-details-cloud-demo.component';
import { FormCloudDemoComponent } from './components/app-layout/cloud/form-demo/cloud-form-demo.component';
import { DemoErrorComponent } from './components/error/demo-error.component';
import { TaskHeaderCloudDemoComponent } from './components/cloud/task-header-cloud-demo.component';
import { ProcessCloudLayoutComponent } from './components/cloud/process-cloud-layout.component';
import { ServiceTaskListCloudDemoComponent } from './components/cloud/service-task-list-cloud-demo.component';
import { SearchFilterChipsComponent } from './components/search/search-filter-chips.component';
export const appRoutes: Routes = [
@ -81,7 +75,6 @@ export const appRoutes: Routes = [
pathMatch: 'full',
loadChildren: () => import('./components/file-view/file-view.module').then(m => m.FileViewModule)
},
{ path: 'preview/s/:id', component: SharedLinkViewComponent },
{
path: '',
component: AppLayoutComponent,
@ -92,10 +85,6 @@ export const appRoutes: Routes = [
redirectTo: `/home`,
pathMatch: 'full'
},
{
path: 'config-editor',
loadChildren: () => import('./components/config-editor/config-editor.module').then(m => m.AppConfigEditorModule)
},
{
path: 'card-view',
loadChildren: () => import('./components/card-view/card-view.module').then(m => m.AppCardViewModule)
@ -118,26 +107,6 @@ export const appRoutes: Routes = [
data: { roles: ['ACTIVITI_USER'], redirectUrl: '/error/403' },
component: AppsCloudDemoComponent
},
{
path: 'people-group-cloud',
data: { roles: ['ACTIVITI_USER'], redirectUrl: '/error/403' },
component: PeopleGroupCloudDemoComponent
},
{
path: 'task-header-cloud',
data: { roles: ['ACTIVITI_USER'], redirectUrl: '/error/403' },
component: TaskHeaderCloudDemoComponent
},
{
path: 'service-task-list',
data: { roles: ['ACTIVITI_ADMIN'], redirectUrl: '/error/403' },
component: ServiceTaskListCloudDemoComponent
},
{
path: 'community',
data: { roles: ['ACTIVITI_USER'], redirectUrl: '/error/403' },
loadChildren: () => import('./components/cloud/community/community.module').then(m => m.AppCommunityModule)
},
{
path: ':appName',
canActivate: [AuthGuardSsoRoleService],
@ -187,11 +156,6 @@ export const appRoutes: Routes = [
path: 'settings-layout',
loadChildren: () => import('./components/settings/settings.module').then(m => m.AppSettingsModule)
},
{
path: 'trashcan',
canActivate: [AuthGuardEcm],
loadChildren: () => import('./components/trashcan/trashcan.module').then(m => m.AppTrashcanModule)
},
{
path: 'files',
component: FilesComponent,
@ -207,11 +171,6 @@ export const appRoutes: Routes = [
component: FilesComponent,
canActivate: [AuthGuardEcm]
},
{
path: 'dl-custom-sources',
canActivate: [AuthGuardEcm],
loadChildren: () => import('./components/files/custom-sources.module').then(m => m.AppCustomSourcesModule)
},
{
path: 'search',
component: SearchResultComponent,
@ -291,14 +250,8 @@ export const appRoutes: Routes = [
component: TreeViewSampleComponent,
canActivate: [AuthGuardEcm]
},
{
path: 'about',
loadChildren: () => import('./components/about/about.module').then(m => m.AppAboutModule)
},
{ path: 'form-cloud', component: FormCloudDemoComponent },
{ path: 'form', component: FormComponent },
{ path: 'form-list', component: FormListComponent },
{ path: 'form-loading', component: FormLoadingComponent },
{
path: 'task-list',
canActivate: [AuthGuardBpm],

View File

@ -1,34 +0,0 @@
<mat-slide-toggle [(ngModel)]="dev">Dev Mode</mat-slide-toggle>
<adf-about>
<adf-about-panel *ngIf="dev" [label]="'ABOUT.SERVER_SETTINGS.TITLE' | translate">
<ng-template>
<adf-about-server-settings></adf-about-server-settings>
</ng-template>
</adf-about-panel>
<adf-about-panel *ngIf="dev" [label]="'ABOUT.PACKAGES.TITLE' | translate">
<ng-template>
<adf-about-package-list [dependencies]="pkg?.dependencies"></adf-about-package-list>
</ng-template>
</adf-about-panel>
<adf-about-panel [label]="'ABOUT.REPOSITORY' | translate" *ngIf="repository">
<ng-template>
<adf-about-repository-info [data]="repository"></adf-about-repository-info>
</ng-template>
</adf-about-panel>
<adf-about-panel [label]="'ABOUT.VERSIONS.TITLE' | translate">
<ng-template>
<adf-about-platform-version [repository]="repository" [process]="bpmVersion"></adf-about-platform-version>
</ng-template>
</adf-about-panel>
<adf-about-panel *ngIf="extensions$ | async as extensions" [label]="'ABOUT.PLUGINS.TITLE' | translate">
<ng-template>
<adf-about-extension-list [data]="extensions"></adf-about-extension-list>
</ng-template>
</adf-about-panel>
</adf-about>

View File

@ -1,67 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnInit } from '@angular/core';
import { AppExtensionService, ExtensionRef } from '@alfresco/adf-extensions';
import { AuthenticationService, BpmProductVersionModel, RepositoryInfo } from '@alfresco/adf-core';
import { DiscoveryApiService } from '@alfresco/adf-content-services';
import pkg from '../../../../../package.json';
import { Observable } from 'rxjs';
@Component({
selector: 'app-about-page',
templateUrl: './about.component.html'
})
export class AboutComponent implements OnInit {
pkg: any;
dev: true;
extensions$: Observable<ExtensionRef[]>;
repository: RepositoryInfo = null;
bpmVersion: BpmProductVersionModel = null;
constructor(
private authenticationService: AuthenticationService,
private appExtensionService: AppExtensionService,
private discoveryApiService: DiscoveryApiService
) {
this.pkg = pkg;
this.extensions$ = this.appExtensionService.references$;
}
ngOnInit(): void {
if (this.authenticationService.isEcmLoggedIn()) {
this.setECMInfo();
}
if (this.authenticationService.isBpmLoggedIn()) {
this.setBPMInfo();
}
}
setECMInfo() {
this.discoveryApiService.getEcmProductInfo().subscribe((repository) => {
this.repository = repository as RepositoryInfo;
});
}
setBPMInfo() {
this.discoveryApiService.getBpmProductInfo().subscribe((bpmVersion) => {
this.bpmVersion = bpmVersion;
});
}
}

View File

@ -1,39 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { AboutComponent } from './about.component';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
const routes: Routes = [
{
path: '',
component: AboutComponent
}
];
@NgModule({
imports: [
CommonModule,
CoreModule,
RouterModule.forChild(routes)
],
declarations: [AboutComponent]
})
export class AppAboutModule {}

View File

@ -18,15 +18,6 @@
<app-search-bar></app-search-bar>
<app-shell-user-info [menuPositionX]="'before'" [menuPositionY]="'above'"></app-shell-user-info>
<button data-automation-id="language-menu-button" mat-icon-button [matMenuTriggerFor]="langMenu">
<mat-icon>language</mat-icon>
</button>
<mat-menu #langMenu="matMenu" class="app-menu">
<adf-language-menu></adf-language-menu>
</mat-menu>
<adf-notification-history menuPositionX="before" menuPositionY="above"></adf-notification-history>
</adf-layout-header>
</ng-template>
</adf-sidenav-layout-header>

View File

@ -33,27 +33,17 @@ export class AppLayoutComponent {
{
href: '/cloud', icon: 'cloud', title: 'Process Cloud', children: [
{ href: '/cloud/', icon: 'cloud', title: 'Home' },
{ href: '/cloud/community', icon: 'cloud', title: 'Community' },
{ href: '/form-cloud', icon: 'poll', title: 'Form' },
{ href: '/cloud/people-group-cloud', icon: 'group', title: 'People/Group Cloud' },
{ href: '/cloud/task-header-cloud', icon: 'cloud', title: 'Task Header Cloud' },
{ href: '/cloud/service-task-list', icon: 'cloud', title: 'Service Task List' }
{ href: '/form-cloud', icon: 'poll', title: 'Form' }
]
},
{ href: '/activiti', icon: 'device_hub', title: 'Process Services', children: [
{ href: '/activiti', icon: 'vpn_key', title: 'App' },
{ href: '/process-list', icon: 'assignment', title: 'Process List' },
{ href: '/form', icon: 'poll', title: 'Form' },
{ href: '/form-list', icon: 'library_books', title: 'Form List' },
{ href: '/form-loading', icon: 'cached', title: 'Form Loading' }
{ href: '/form', icon: 'poll', title: 'Form' }
]},
{ href: '/login', icon: 'vpn_key', title: 'Login' },
{ href: '/trashcan', icon: 'delete', title: 'Trashcan' },
{ href: '/dl-custom-sources', icon: 'extension', title: 'Custom Sources' },
{ href: '/settings-layout', icon: 'settings', title: 'Settings' },
{ href: '/config-editor', icon: 'code', title: 'Configuration Editor' },
{ href: '/treeview', icon: 'nature', title: 'Tree View' },
{ href: '/about', icon: 'info_outline', title: 'About' }
{ href: '/treeview', icon: 'nature', title: 'Tree View' }
];
enableRedirect = true;

View File

@ -1,6 +1,5 @@
<div class="main-content">
<mat-tab-group>
<mat-tab-group [animationDuration]="0">
<mat-tab label="Form" class="form-cloud-render">
<div class="app-form-container">
<adf-cloud-form
@ -13,8 +12,7 @@
<div class="app-console" #console>
<h3>Error log:</h3>
<p *ngFor="let error of errorFields">Error {{ error.name }} {{error.validationSummary.message |
translate}}</p>
<p *ngFor="let error of errorFields">Error {{ error.name }} {{error.validationSummary.message | translate}}</p>
</div>
</mat-tab>
<mat-tab label="Editor" class="form-cloud-editor">
@ -26,15 +24,9 @@
(onInit)="onInitFormEditor($event)">
</ngx-monaco-editor>
<div class="app-form-editor-buttons">
<button mat-raised-button id="app-form-config-save" (click)="onSaveFormConfig()" color="primary">Save
form config
</button>
<button mat-raised-button id="app-form-config-clear" (click)="onClearFormConfig()" color="primary">Clear
form config
</button>
</div>
<div class="app-upload-config-button">
<a mat-raised-button color="primary" >
<button mat-raised-button id="app-form-config-save" (click)="onSaveFormConfig()">Save form config</button>
<button mat-raised-button id="app-form-config-clear" (click)="onClearFormConfig()">Clear form config</button>
<a mat-raised-button class="app-upload-config-button">
<mat-icon>file_upload</mat-icon>
<label for="upload-config-file">Upload JSON File</label>
<input
@ -46,7 +38,6 @@
(change)="onConfigAdded($event)">
</a>
</div>
</mat-tab>
</mat-tab-group>

View File

@ -6,11 +6,6 @@
padding: 0 15px;
}
.app-card-view {
width: 30%;
display: inline-block;
}
.app-console {
width: 60%;
display: inline-block;
@ -36,22 +31,18 @@
}
.app-form-editor-buttons {
display: flex;
justify-content: space-evenly;
& > .mat-raised-button {
margin-right: 5px;
}
}
.app-upload-config-button {
display: flex;
justify-content: center;
input {
cursor: pointer;
height: 100%;
right: 0;
opacity: 0;
position: absolute;
top: 0;
width: 300px;
z-index: 4;
}
}

View File

@ -49,6 +49,4 @@
</mat-slide-toggle>
</p>
<button mat-button id="adf-reset-card-log" (click)="reset()" color="primary">Reset Log</button>
<br>
<button mat-raised-button id="adf-reset-card-log" (click)="reset()">Reset Log</button>

View File

@ -1,34 +0,0 @@
<mat-tab-group class="app-cloud-layout-tab-body">
<mat-tab label="App">
<adf-sidenav-layout [sidenavMin]="70" [sidenavMax]="270" [stepOver]="780">
<adf-sidenav-layout-navigation>
<ng-template>
<adf-sidebar-action-menu [expanded]="true" [width]="205" title="CREATE">
<mat-icon adf-sidebar-menu-title-icon>arrow_drop_down</mat-icon>
<div adf-sidebar-menu-options>
<button mat-menu-item data-automation-id="btn-start-task" (click)="onStartTask()">
<mat-icon>assessment</mat-icon>
<span>New Task</span>
</button>
</div>
<div adf-sidebar-menu-options>
<button mat-menu-item data-automation-id="btn-start-process" (click)="onStartProcess()">
<mat-icon>assessment</mat-icon>
<span>New Process</span>
</button>
</div>
</adf-sidebar-action-menu>
<app-community-cloud-filters-demo></app-community-cloud-filters-demo>
</ng-template>
</adf-sidenav-layout-navigation>
<adf-sidenav-layout-content>
<ng-template>
<router-outlet></router-outlet>
</ng-template>
</adf-sidenav-layout-content>
</adf-sidenav-layout>
</mat-tab>
<mat-tab label="Settings">
<app-cloud-settings></app-cloud-settings>
</mat-tab>
</mat-tab-group>

View File

@ -1,20 +0,0 @@
.app-cloud-layout-overflow {
overflow: auto;
}
.app-cloud-layout-tab-body {
height: 100%;
min-height: 100%;
min-width: 100%;
width: 100%;
.mat-tab-body-wrapper {
height: 100%;
}
adf-sidenav-layout {
min-height: 100%;
min-width: 100%;
}
}

View File

@ -1,59 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { CloudLayoutService } from '../services/cloud-layout.service';
@Component({
templateUrl: './community-cloud.component.html',
styleUrls: ['./community-cloud.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class CommunityCloudComponent implements OnInit {
constructor(
private router: Router,
private route: ActivatedRoute,
private cloudLayoutService: CloudLayoutService
) { }
ngOnInit() {
let root: string = '';
if (this.route.snapshot && this.route.snapshot.firstChild) {
root = this.route.snapshot.firstChild.url[0].path;
}
this.route.queryParams.subscribe((params) => {
if (root === 'tasks' && params.id) {
this.cloudLayoutService.setCurrentTaskFilterParam({ id: params.id });
}
if (root === 'processes' && params.id) {
this.cloudLayoutService.setCurrentProcessFilterParam({ id: params.id });
}
});
}
onStartTask() {
this.router.navigate([`/cloud/community/start-task/`]);
}
onStartProcess() {
this.router.navigate([`/cloud/community/start-process/`]);
}
}

View File

@ -1,29 +0,0 @@
<mat-accordion>
<mat-expansion-panel [expanded]="expandTaskFilter" (opened)="onTaskFilterOpen()" (closed)="onTaskFilterClose()" data-automation-id='Task Filters'>
<mat-expansion-panel-header>
<mat-panel-title>
Task Filters
</mat-panel-title>
</mat-expansion-panel-header>
<adf-cloud-task-filters
*ngIf="expandTaskFilter"
[showIcons]="true"
[filterParam]="currentTaskFilter$ | async"
(filterClick)="onTaskFilterSelected($event)">
</adf-cloud-task-filters>
</mat-expansion-panel>
<mat-expansion-panel [expanded]="expandProcessFilter" (opened)="onProcessFilterOpen()" (closed)="onProcessFilterClose()" data-automation-id='Process Filters'>
<mat-expansion-panel-header>
<mat-panel-title>
Process Filters
</mat-panel-title>
</mat-expansion-panel-header>
<adf-cloud-process-filters
*ngIf="expandProcessFilter"
[showIcons]="true"
[filterParam]="currentProcessFilter$ | async"
(filterClick)="onProcessFilterSelected($event)">
</adf-cloud-process-filters>
</mat-expansion-panel>
</mat-accordion>

View File

@ -1,92 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, ViewEncapsulation, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { Router, ActivatedRoute } from '@angular/router';
import { CloudLayoutService } from '../services/cloud-layout.service';
@Component({
selector: 'app-community-cloud-filters-demo',
templateUrl: './community-filters.component.html',
encapsulation: ViewEncapsulation.None
})
export class CommunityCloudFiltersDemoComponent implements OnInit {
currentTaskFilter$: Observable<any>;
currentProcessFilter$: Observable<any>;
toggleTaskFilter = true;
toggleProcessFilter = true;
expandTaskFilter = true;
expandProcessFilter = false;
constructor(
private cloudLayoutService: CloudLayoutService,
private router: Router,
private route: ActivatedRoute
) {}
ngOnInit() {
this.currentTaskFilter$ = this.cloudLayoutService.taskFilter$;
this.currentProcessFilter$ = this.cloudLayoutService.processFilter$;
let root = '';
if (this.route.snapshot && this.route.snapshot.firstChild) {
root = this.route.snapshot.firstChild.url[0].path;
if (root === 'tasks') {
this.expandTaskFilter = true;
this.expandProcessFilter = false;
} else if (root === 'processes') {
this.expandProcessFilter = true;
this.expandTaskFilter = false;
}
}
}
onTaskFilterSelected(filter) {
this.cloudLayoutService.setCurrentTaskFilterParam({id: filter.id});
const currentFilter = Object.assign({}, filter);
this.router.navigate([`/cloud/community/tasks/`], { queryParams: currentFilter });
}
onProcessFilterSelected(filter) {
this.cloudLayoutService.setCurrentProcessFilterParam({id: filter.id});
const currentFilter = Object.assign({}, filter);
this.router.navigate([`/cloud/community/processes/`], { queryParams: currentFilter });
}
onTaskFilterOpen(): boolean {
this.expandTaskFilter = true;
this.expandProcessFilter = false;
return this.toggleTaskFilter;
}
onTaskFilterClose(): boolean {
return !this.toggleTaskFilter;
}
onProcessFilterOpen(): boolean {
this.expandProcessFilter = true;
this.expandTaskFilter = false;
return this.toggleProcessFilter;
}
onProcessFilterClose(): boolean {
return !this.toggleProcessFilter;
}
}

View File

@ -1,21 +0,0 @@
<button data-automation-id="go-back" mat-icon-button (click)="onGoBack()">
<mat-icon>arrow_back</mat-icon> Go Back
</button>
<h4 data-automation-id="process-details-header">Simple page to show the process instance: {{ processInstanceId }}</h4>
<div class="app-process-cloud-container">
<adf-cloud-task-list
class="app-cloud-layout-overflow"
[processInstanceId]="processInstanceId"
(rowClick)="onRowClick($event)">
</adf-cloud-task-list>
<adf-cloud-process-header
class="app-process-cloud-header"
[processInstanceId]="processInstanceId">
</adf-cloud-process-header>
</div>

View File

@ -1,17 +0,0 @@
app-community-process-details-cloud {
.app {
&-process-cloud-container {
display: flex;
}
&-cloud-layout-overflow {
width: 67%;
flex: 1;
}
&-process-cloud-header {
margin-left: 10px;
width: 25%;
}
}
}

View File

@ -1,46 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
@Component({
selector: 'app-community-process-details-cloud',
templateUrl: './community-process-details-cloud.component.html',
styleUrls: ['./community-process-details-cloud.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class CommunityProcessDetailsCloudDemoComponent {
processInstanceId: string;
constructor(private route: ActivatedRoute, private router: Router) {
this.route.params.subscribe((params) => {
this.processInstanceId = params.processInstanceId;
});
}
onGoBack() {
this.router.navigate([`/cloud/community/`]);
}
onRowClick(taskId: string) {
if (taskId) {
this.router.navigate([`/cloud/community/task-details/${taskId}`]);
}
}
}

View File

@ -1,42 +0,0 @@
<adf-cloud-edit-process-filter
[id]="filterId"
[filterProperties]="processFilterProperties.filterProperties"
[sortProperties]="processFilterProperties.sortProperties"
[actions]="processFilterProperties.actions"
(filterChange)="onFilterChange($event)"
(action)="onProcessFilterAction($event)">
</adf-cloud-edit-process-filter>
<div
class="app-cloud-process-list-container"
*ngIf="editedFilter">
<adf-cloud-process-list
#processCloud
class="app-cloud-layout-overflow"
[initiator]="editedFilter.initiator"
[processDefinitionId]="editedFilter.processDefinitionId"
[processDefinitionKey]="editedFilter.processDefinitionKey"
[id]="editedFilter.processInstanceId"
[status]="editedFilter.status"
[name]="editedFilter.processName"
[businessKey]="editedFilter['businessKey']"
[lastModifiedFrom]="editedFilter.lastModifiedFrom"
[lastModifiedTo]="editedFilter.lastModifiedTo"
[sorting]="sortArray"
[selectionMode]="selectionMode"
[multiselect]="multiselect"
(rowClick)="onRowClick($event)"
(rowsSelected)="onRowsSelected($event)">
</adf-cloud-process-list>
<adf-pagination
[target]="processCloud"
(changePageSize)="onChangePageSize($event)"
(nextPage)="resetSelectedRows()"
(prevPage)="resetSelectedRows()">
</adf-pagination>
<div *ngIf="testingMode">
Selected rows:
<ul>
<li *ngFor="let row of selectedRows">{{ row.id }}</li>
</ul>
</div>
</div>

View File

@ -1,21 +0,0 @@
app-community-processes-cloud-demo {
height: 100%;
min-height: 100%;
min-width: 100%;
width: 100%;
.app-cloud-process-list-container {
place-content: stretch space-between;
align-items: stretch;
margin-top: 2px;
}
&, .app-cloud-process-list-container {
flex-direction: column;
display: flex;
}
.app-cloud-layout-overflow, .app-cloud-process-list-container {
flex: 1;
}
}

View File

@ -1,153 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';
import {
ProcessFilterCloudModel,
ProcessFilterCloudService,
ProcessFiltersCloudComponent,
ProcessListCloudComponent,
ProcessListCloudSortingModel
} from '@alfresco/adf-process-services-cloud';
import { ActivatedRoute, Router } from '@angular/router';
import { AppConfigService, UserPreferencesService } from '@alfresco/adf-core';
import { CloudLayoutService } from '../services/cloud-layout.service';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { Pagination } from '@alfresco/js-api';
const PROCESS_FILTER_PROPERTY_KEYS = 'adf-edit-process-filter';
const ACTION_SAVE_AS = 'saveAs';
@Component({
selector: 'app-community-processes-cloud-demo',
templateUrl: './community-processes-cloud.component.html',
styleUrls: ['./community-processes-cloud.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class CommunityProcessesCloudDemoComponent implements OnInit, OnDestroy {
@ViewChild('processCloud')
processCloud: ProcessListCloudComponent;
@ViewChild('processFiltersCloud')
processFiltersCloud: ProcessFiltersCloudComponent;
isFilterLoaded: boolean;
filterId: string = '';
sortArray: any = [];
selectedRow: any;
multiselect: boolean;
selectionMode: string;
selectedRows: any[] = [];
testingMode: boolean;
processFilterProperties: any = { filterProperties: [], sortProperties: [], actions: [] };
editedFilter: ProcessFilterCloudModel;
private onDestroy$ = new Subject<boolean>();
constructor(
private route: ActivatedRoute,
private router: Router,
private cloudLayoutService: CloudLayoutService,
private userPreference: UserPreferencesService,
private processFilterCloudService: ProcessFilterCloudService,
private appConfig: AppConfigService) {
const properties = this.appConfig.get<Array<any>>(
PROCESS_FILTER_PROPERTY_KEYS
);
if (properties) {
this.processFilterProperties = properties;
}
}
ngOnInit() {
this.isFilterLoaded = false;
this.route.queryParams.subscribe((params) => {
if (Object.keys(params).length > 0) {
this.isFilterLoaded = true;
this.onFilterChange(params);
this.filterId = params.id;
} else {
this.loadDefaultFilters();
}
});
this.cloudLayoutService
.settings$
.pipe(takeUntil(this.onDestroy$))
.subscribe(settings => this.setCurrentSettings(settings));
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
loadDefaultFilters() {
this.processFilterCloudService
.getProcessFilters('community')
.subscribe((filters: ProcessFilterCloudModel[]) => {
this.onFilterChange(filters[0]);
});
}
setCurrentSettings(settings) {
if (settings) {
this.multiselect = settings.multiselect;
this.testingMode = settings.testingMode;
this.selectionMode = settings.selectionMode;
}
}
onChangePageSize(event: Pagination) {
this.userPreference.paginationSize = event.maxItems;
}
resetSelectedRows() {
this.selectedRows = [];
}
onRowClick(processInstanceId: string) {
this.router.navigate([`/cloud/community/process-details/${processInstanceId}`]);
}
onFilterChange(query: any) {
this.editedFilter = Object.assign({}, query);
this.sortArray = [
new ProcessListCloudSortingModel({
orderBy: this.editedFilter.sort,
direction: this.editedFilter.order
})
];
}
onProcessFilterAction(filterAction: any) {
this.cloudLayoutService.setCurrentProcessFilterParam({ id: filterAction.filter.id });
if (filterAction.actionType === ACTION_SAVE_AS) {
this.router.navigate([`/cloud/community/processes/`], { queryParams: filterAction.filter });
}
}
onRowsSelected(nodes) {
this.resetSelectedRows();
this.selectedRows = nodes.map((node) => node.obj);
}
}

View File

@ -1,6 +0,0 @@
<adf-cloud-start-process
[name]="processName"
(error)="openSnackMessage($event)"
(success)="onStartProcessSuccess()"
(cancel)="onCancelStartProcess()">
</adf-cloud-start-process>

View File

@ -1,55 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { NotificationService, AppConfigService } from '@alfresco/adf-core';
import { CloudLayoutService } from '../services/cloud-layout.service';
@Component({
templateUrl: './community-start-process-cloud.component.html'
})
export class CommunityStartProcessCloudDemoComponent implements OnInit {
processName: string;
constructor(private appConfig: AppConfigService,
private cloudLayoutService: CloudLayoutService,
private notificationService: NotificationService,
private router: Router) {
}
ngOnInit() {
this.processName = this.appConfig.get<string>('adf-start-process-cloud.name');
}
onStartProcessSuccess() {
this.cloudLayoutService.setCurrentProcessFilterParam({ key: 'running-processes' });
this.router.navigate([`/cloud/community/processes`]);
}
onCancelStartProcess() {
this.cloudLayoutService.setCurrentProcessFilterParam({ key: 'all-processes' });
this.router.navigate([`/cloud/community/processes`]);
}
openSnackMessage(event: any) {
this.notificationService.openSnackMessage(
event.response.body.message
);
}
}

View File

@ -1,5 +0,0 @@
<adf-cloud-start-task
(error)="openSnackMessage($event)"
(success)="onStartTaskSuccess()"
(cancel)="onCancelStartTask()">
</adf-cloud-start-task>

View File

@ -1,48 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { NotificationService } from '@alfresco/adf-core';
import { CloudLayoutService } from '../services/cloud-layout.service';
@Component({
templateUrl: './community-start-task-cloud.component.html'
})
export class CommunityStartTaskCloudDemoComponent {
constructor(
private cloudLayoutService: CloudLayoutService,
private notificationService: NotificationService,
private router: Router) {
}
onStartTaskSuccess() {
this.cloudLayoutService.setCurrentTaskFilterParam({key: 'community'});
this.router.navigate([`/cloud/community/tasks`]);
}
onCancelStartTask() {
this.cloudLayoutService.setCurrentTaskFilterParam({key: 'community'});
this.router.navigate([`/cloud/community/tasks`]);
}
openSnackMessage(event: any) {
this.notificationService.openSnackMessage(
event.response.body.message
);
}
}

View File

@ -1,46 +0,0 @@
<adf-cloud-edit-task-filter
[id]="filterId"
[filterProperties]="taskFilterProperties.filterProperties"
[sortProperties]="taskFilterProperties.sortProperties"
[actions]="taskFilterProperties.actions"
(action)="onTaskFilterAction($event)"
(filterChange)="onFilterChange($event)">
</adf-cloud-edit-task-filter>
<div
class="app-cloud-task-list-container"
*ngIf="editedFilter">
<adf-cloud-task-list
#taskCloud
class="app-cloud-layout-overflow"
[processDefinitionId]="editedFilter.processDefinitionId"
[processInstanceId]="editedFilter.processInstanceId"
[name]="editedFilter.taskName"
[id]="editedFilter.taskId"
[parentTaskId]="editedFilter.parentTaskId"
[priority]="editedFilter.priority"
[owner]="editedFilter.owner"
[lastModifiedFrom]="editedFilter.lastModifiedFrom"
[lastModifiedTo]="editedFilter.lastModifiedTo"
[status]="editedFilter.status"
[assignee]="editedFilter.assignee"
[createdDate]="editedFilter.createdDate"
[dueDate]="editedFilter.dueDate"
[sorting]="sortArray"
[multiselect]="multiselect"
[selectionMode]="selectionMode"
(rowClick)="onRowClick($event)"
(rowsSelected)="onRowsSelected($event)">
</adf-cloud-task-list>
<adf-pagination
[target]="taskCloud"
(changePageSize)="onChangePageSize($event)"
(nextPage)="resetSelectedRows()"
(prevPage)="resetSelectedRows()">
</adf-pagination>
<div *ngIf="testingMode">
Selected rows:
<ul>
<li *ngFor="let row of selectedRows" [attr.data-automation-id]="row.id">{{ row.name }}</li>
</ul>
</div>
</div>

View File

@ -1,27 +0,0 @@
app-community-tasks-cloud-demo {
height: 100%;
min-height: 100%;
min-width: 100%;
width: 100%;
.adf-cloud-layout-tab-body {
.mat-tab-body-wrapper {
height: 100%;
}
}
.app-cloud-task-list-container {
place-content: stretch space-between;
align-items: stretch;
margin-top: 2px;
}
&, .app-cloud-task-list-container {
flex-direction: column;
display: flex;
}
.app-cloud-layout-overflow, .app-cloud-task-list-container {
flex: 1;
}
}

View File

@ -1,148 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';
import {
TaskFilterCloudModel,
TaskFilterCloudService,
TaskListCloudComponent,
TaskListCloudSortingModel
} from '@alfresco/adf-process-services-cloud';
import { AppConfigService, UserPreferencesService } from '@alfresco/adf-core';
import { ActivatedRoute, Router } from '@angular/router';
import { CloudLayoutService } from '../services/cloud-layout.service';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { Pagination } from '@alfresco/js-api';
const ACTION_SAVE_AS = 'saveAs';
const TASK_FILTER_PROPERTY_KEYS = 'adf-edit-task-filter';
@Component({
selector: 'app-community-tasks-cloud-demo',
templateUrl: './community-task-cloud.component.html',
styleUrls: ['./community-task-cloud.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class CommunityTasksCloudDemoComponent implements OnInit, OnDestroy {
@ViewChild('taskCloud')
taskCloud: TaskListCloudComponent;
isFilterLoaded = false;
selectedRow: any;
sortArray: TaskListCloudSortingModel[];
editedFilter: TaskFilterCloudModel;
taskFilterProperties: any = { filterProperties: [], sortProperties: [], actions: [] };
filterId;
multiselect: boolean;
selectedRows: any[] = [];
testingMode: boolean;
selectionMode: string;
taskDetailsRedirection: boolean;
private onDestroy$ = new Subject<boolean>();
constructor(
private cloudLayoutService: CloudLayoutService,
private route: ActivatedRoute,
private router: Router,
private taskFilterCloudService: TaskFilterCloudService,
private userPreference: UserPreferencesService,
private appConfig: AppConfigService) {
const properties = this.appConfig.get<Array<any>>(TASK_FILTER_PROPERTY_KEYS);
if (properties) {
this.taskFilterProperties = properties;
}
}
ngOnInit() {
this.isFilterLoaded = false;
this.route.queryParams.subscribe((params) => {
if (Object.keys(params).length > 0) {
this.isFilterLoaded = true;
this.onFilterChange(params);
this.filterId = params.id;
} else {
setTimeout( () => {
this.loadDefaultFilters();
});
}
});
this.cloudLayoutService
.settings$
.pipe(takeUntil(this.onDestroy$))
.subscribe(settings => this.setCurrentSettings(settings));
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
loadDefaultFilters() {
this.taskFilterCloudService
.getTaskListFilters('community')
.subscribe((filters: TaskFilterCloudModel[]) => {
this.onFilterChange(filters[0]);
});
}
setCurrentSettings(settings) {
if (settings) {
this.multiselect = settings.multiselect;
this.testingMode = settings.testingMode;
this.selectionMode = settings.selectionMode;
this.taskDetailsRedirection = settings.taskDetailsRedirection;
}
}
onChangePageSize(event: Pagination) {
this.userPreference.paginationSize = event.maxItems;
}
resetSelectedRows() {
this.selectedRows = [];
}
onRowClick(taskId: string) {
if (!this.multiselect && this.selectionMode !== 'multiple' && this.taskDetailsRedirection) {
this.router.navigate([`/cloud/community/task-details/${taskId}`]);
}
}
onRowsSelected(nodes) {
this.resetSelectedRows();
this.selectedRows = nodes.map((node) => node.obj);
}
onFilterChange(filter: any) {
this.editedFilter = Object.assign({}, filter);
this.sortArray = [new TaskListCloudSortingModel({ orderBy: this.editedFilter.sort, direction: this.editedFilter.order })];
}
onTaskFilterAction(filterAction: any) {
this.cloudLayoutService.setCurrentTaskFilterParam({ id: filterAction.filter.id });
if (filterAction.actionType === ACTION_SAVE_AS) {
this.router.navigate([`/cloud/community/tasks/`], { queryParams: filterAction.filter });
}
}
}

View File

@ -1,16 +0,0 @@
<h4 data-automation-id="task-details-header">Simple page to show the taskId: {{ taskId }}</h4>
<div class="app-community-task-details-cloud-column">
<div class="app-community-task-details-cloud-row">
<adf-cloud-task-form
[taskId]="taskId"
(cancelClick)="goBack()"
(taskClaimed)="onClaimTask()"
(taskCompleted)="onTaskCompleted()"
(taskUnclaimed)="onUnclaimTask()"
(formSaved)="onFormSaved()"
(error)="onError($event)">
</adf-cloud-task-form>
<adf-cloud-task-header [taskId]="taskId"></adf-cloud-task-header>
</div>
</div>

View File

@ -1,48 +0,0 @@
app-community-task-details-cloud {
.app {
&-task-detail-container {
display: flex;
}
&-task-title {
margin-left: 15px;
}
&-task-control {
width: 70%;
}
&-demop-card-container {
width: 30%;
font-family: inherit;
}
&-community-task-details-cloud-column {
margin: 0;
flex-direction: column;
.app-community-task-details-cloud-row {
flex-direction: row;
adf-cloud-task-form {
flex: 1 1 100%;
flex-direction: column;
display: flex;
max-width: 80%;
}
adf-cloud-task-header {
flex: 1;
}
}
}
&-community-task-details-cloud-column, &-community-task-details-cloud-row {
height: 100%;
min-height: 100%;
min-width: 100%;
width: 100%;
display: flex;
}
}
}

View File

@ -1,78 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { NotificationService } from '@alfresco/adf-core';
@Component({
selector: 'app-community-task-details-cloud',
templateUrl: './community-task-details-cloud.component.html',
styleUrls: ['./community-task-details-cloud.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class CommunityTaskDetailsCloudDemoComponent {
taskId: string;
constructor(
private route: ActivatedRoute,
private router: Router,
private notificationService: NotificationService
) {
this.route.params.subscribe((params) => {
this.taskId = params.taskId;
});
}
isTaskValid(): boolean {
return this.taskId !== undefined;
}
goBack() {
this.router.navigate([`/cloud/community/`]);
}
onCompletedTask() {
this.goBack();
}
onUnclaimTask() {
this.goBack();
}
onClaimTask() {
this.goBack();
}
onTaskCompleted() {
this.goBack();
}
onFormSaved() {
this.notificationService.openSnackMessage('Task has been saved successfully');
}
onError({ message: error }: Error) {
let errorMessage;
try {
errorMessage = JSON.parse(error).message || JSON.parse(error).entry?.message;
errorMessage = JSON.parse(errorMessage).message;
} catch {}
this.notificationService.showError(errorMessage || error);
}
}

View File

@ -1,95 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import {
ProcessServicesCloudModule,
LocalPreferenceCloudService,
PROCESS_FILTERS_SERVICE_TOKEN,
TASK_FILTERS_SERVICE_TOKEN
} from '@alfresco/adf-process-services-cloud';
import { CommunityCloudComponent } from './community-cloud.component';
import { CommunityTasksCloudDemoComponent } from './community-task-cloud.component';
import { CommunityCloudFiltersDemoComponent } from './community-filters.component';
import { CommunityProcessesCloudDemoComponent } from './community-processes-cloud.component';
import { CommunityStartProcessCloudDemoComponent } from './community-start-process-cloud.component';
import { CommunityStartTaskCloudDemoComponent } from './community-start-task-cloud.component';
import { CommunityProcessDetailsCloudDemoComponent } from './community-process-details-cloud.component';
import { CommunityTaskDetailsCloudDemoComponent } from './community-task-details-cloud.component';
import { AppCloudSharedModule } from '../shared/cloud.shared.module';
const routes: Routes = [
{
path: '',
component: CommunityCloudComponent,
children: [
{
path: 'tasks',
component: CommunityTasksCloudDemoComponent
},
{
path: 'processes',
component: CommunityProcessesCloudDemoComponent
},
{
path: 'start-task',
component: CommunityStartTaskCloudDemoComponent
},
{
path: 'start-process',
component: CommunityStartProcessCloudDemoComponent
},
{
path: 'task-details/:taskId',
component: CommunityTaskDetailsCloudDemoComponent
},
{
path: 'process-details/:processInstanceId',
component: CommunityProcessDetailsCloudDemoComponent
}
]
}
];
@NgModule({
imports: [
CommonModule,
CoreModule,
ProcessServicesCloudModule,
RouterModule.forChild(routes),
AppCloudSharedModule
],
declarations: [
CommunityCloudComponent,
CommunityTasksCloudDemoComponent,
CommunityCloudFiltersDemoComponent,
CommunityProcessesCloudDemoComponent,
CommunityStartProcessCloudDemoComponent,
CommunityStartTaskCloudDemoComponent,
CommunityProcessDetailsCloudDemoComponent,
CommunityTaskDetailsCloudDemoComponent
],
providers: [
{ provide: PROCESS_FILTERS_SERVICE_TOKEN, useClass: LocalPreferenceCloudService },
{ provide: TASK_FILTERS_SERVICE_TOKEN, useClass: LocalPreferenceCloudService }
]
})
export class AppCommunityModule {}

View File

@ -1,128 +0,0 @@
<mat-card class="app-section">
<mat-card-title>People Cloud Component</mat-card-title>
<mat-card-content>
<br>
<mat-radio-group (change)="onChangePeopleMode($event)">
<mat-radio-button [checked]="true" class="app-people-single-mode" data-automation-id="app-people-single-mode" value="single">Single Selection</mat-radio-button>
<mat-radio-button class="app-people-multiple-mode" data-automation-id="app-people-multiple-mode" value="multiple">Multiple Selection</mat-radio-button>
</mat-radio-group>
<div class="app-people-control-options">
<mat-form-field *ngIf="isPeopleAppNameSelected()" class="app-preselect-value">
<mat-label>Application Name</mat-label>
<input matInput (input)="setPeopleAppName($any($event).target?.value)" data-automation-id="app-people-app-input" />
</mat-form-field>
<mat-form-field class="app-preselect-value">
<mat-label>Roles: ["ACTIVITI_ADMIN", "ACTIVITI_USER"]</mat-label>
<input matInput (input)="setPeopleRoles($any($event).target?.value)" data-automation-id="app-people-roles-input"/>
</mat-form-field>
<mat-form-field class="app-preselect-value">
<mat-label>Groups Restriction ["hr", "sales"]</mat-label>
<input matInput
(input)="setPeopleGroupsRestriction($any($event).target?.value)"
data-automation-id="app-people-groups-restriction-input"/>
</mat-form-field>
<mat-form-field class="app-preselect-value-full">
<mat-label>Preselect: {{ defaultPeoplePlaceholder }}</mat-label>
<input matInput (input)="setPeoplePreselectValue($any($event).target?.value)" data-automation-id="app-people-preselect-input" />
</mat-form-field>
<mat-checkbox class="app-preselect-value" (change)="onChangePeopleValidation($event)">Preselect validation</mat-checkbox>
<mat-checkbox data-automation-id="app-people-readonly" value="{{ peopleReadonly }}" (change)="onChangePeopleReadonly($event)">Read-only Mode</mat-checkbox>
</div>
<div>
<adf-cloud-people
[preSelectUsers]="preSelectUsers"
[readOnly]="peopleReadonly"
[validate]="peoplePreselectValidation"
[appName]="peopleAppName"
[roles]="peopleRoles"
[groupsRestriction]="groupsRestriction"
[title]="'ADF_TASK_LIST.START_TASK.FORM.LABEL.ASSIGNEE'"
[mode]="peopleMode"
(warning)="onUsersWarning($event)"></adf-cloud-people>
</div>
<div class="app-people-list" *ngIf="peopleMode === 'multiple'">
<h4>All Preselected Users</h4>
<mat-list role="list">
<mat-list-item *ngFor="let item of preSelectUsers" role="listitem">
<mat-icon mat-list-icon>person</mat-icon>
{{item | fullName}}
</mat-list-item>
</mat-list>
<div *ngIf="invalidUsers.length > 0">
<h4>Invalid Users <mat-icon>warning</mat-icon> </h4>
<mat-list role="list">
<mat-list-item *ngFor="let invalidUser of invalidUsers" role="listitem">
<mat-icon mat-list-icon>person</mat-icon>
{{invalidUser | fullName}}
</mat-list-item>
</mat-list>
</div>
</div>
</mat-card-content>
</mat-card>
<mat-card class="app-section">
<mat-card-title>Groups Cloud Component</mat-card-title>
<mat-card-content>
<br>
<mat-radio-group (change)="onChangeGroupsMode($event)">
<mat-radio-button [checked]="true" class="app-people-single-mode" data-automation-id="app-group-single-mode" value="single">Single Selection</mat-radio-button>
<mat-radio-button class="app-people-multiple-mode" data-automation-id="app-group-multiple-mode" value="multiple">Multiple Selection</mat-radio-button>
</mat-radio-group>
<div class="app-groups-control-options">
<mat-form-field *ngIf="isGroupAppNameSelected()" class="app-preselect-value">
<mat-label>Application Name</mat-label>
<input matInput (input)="setGroupAppName($any($event).target?.value)" data-automation-id="app-group-app-input"/>
</mat-form-field>
<mat-form-field class="app-preselect-value">
<mat-label>Roles: ["ACTIVITI_ADMIN", "ACTIVITI_USER"]</mat-label>
<input matInput (input)="setGroupRoles($any($event).target?.value)" data-automation-id="app-group-roles-input"/>
</mat-form-field>
<mat-form-field class="app-preselect-value-full">
<mat-label>Preselect: {{ defaultGroupPlaceholder }}</mat-label>
<input matInput (input)="setGroupsPreselectValue($any($event).target?.value)" data-automation-id="app-group-preselect-input" />
</mat-form-field>
<mat-checkbox class="app-preselect-value" (change)="onChangeGroupValidation($event)">Preselect validation</mat-checkbox>
<mat-checkbox
data-automation-id="app-group-readonly"
value="{{ groupReadonly }}"
(change)="onChangeGroupReadonly($event)">
Read-only Mode
</mat-checkbox>
</div>
<div>
<adf-cloud-group
[mode]="groupMode"
[readOnly]="groupReadonly"
[validate]="groupPreselectValidation"
[roles]="groupRoles"
[appName]="groupAppName"
[preSelectGroups]="preSelectGroup"
(warning)="onGroupsWarning($event)"></adf-cloud-group>
</div>
<div class="app-group-list" *ngIf="groupMode === 'multiple'">
<h4>All Preselected Groups</h4>
<mat-list role="list">
<mat-list-item *ngFor="let item of preSelectGroup" role="listitem">
<mat-icon mat-list-icon>group</mat-icon>
{{ item.name }}
</mat-list-item>
</mat-list>
<div *ngIf="invalidGroups.length > 0">
<h4>Invalid Groups <mat-icon>warning</mat-icon> </h4>
<mat-list role="list">
<mat-list-item *ngFor="let invalidGroup of invalidGroups" role="listitem">
<mat-icon mat-list-icon>group</mat-icon>
{{invalidGroup?.name}}
</mat-list-item>
</mat-list>
</div>
</div>
</mat-card-content>
</mat-card>

View File

@ -1,31 +0,0 @@
.app {
&-section {
mat-card-title {
font-size: 18px;
font-weight: bold;
}
mat-radio-group {
margin: 7px 10px;
mat-radio-button {
margin: 0 3px;
}
}
mat-card-content {
.app-preselect-value {
margin-right: 15px;
min-width: 25%;
&-big {
width: 60%;
}
&-full {
width: 100%;
}
}
}
}
}

View File

@ -1,164 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, ViewEncapsulation } from '@angular/core';
import { ComponentSelectionMode, IdentityUserModel, IdentityGroupModel } from '@alfresco/adf-process-services-cloud';
import { MatCheckboxChange } from '@angular/material/checkbox';
import { MatRadioChange } from '@angular/material/radio';
@Component({
selector: 'app-people-groups-cloud',
templateUrl: './people-groups-cloud-demo.component.html',
styleUrls: ['./people-groups-cloud-demo.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class PeopleGroupCloudDemoComponent {
defaultFilterMode: string = 'appName';
defaultGroupPlaceholder: string = `[{"id": "1", "name":"activitiUserGroup"}]`;
defaultPeoplePlaceholder: string = `[{"id": "1", email": "user@user.com", "firstName":"user", "lastName": "lastName", "username": "user"}]`;
peopleMode: ComponentSelectionMode = 'single';
preSelectUsers: IdentityUserModel[] = [];
invalidUsers: IdentityUserModel[] = [];
peopleRoles: string[] = [];
groupsRestriction: string[] = [];
peopleAppName: string;
peopleFilterMode: string = this.defaultFilterMode;
peoplePreselectValidation = false;
groupPreselectValidation = false;
peopleReadonly = false;
groupReadonly = false;
groupMode: ComponentSelectionMode = 'single';
preSelectGroup: IdentityGroupModel[] = [];
invalidGroups: IdentityGroupModel[] = [];
groupRoles: string[];
groupAppName: string;
groupFilterMode: string = this.defaultFilterMode;
setPeoplePreselectValue(value: string): void {
this.preSelectUsers = this.getArrayFromString(value);
}
setGroupsPreselectValue(value: string): void {
this.preSelectGroup = this.getArrayFromString(value);
}
setPeopleRoles(value: string): void {
this.peopleRoles = this.getArrayFromString(value);
}
setGroupRoles(value: string): void {
this.groupRoles = this.getArrayFromString(value);
}
setPeopleAppName(value: string): void {
this.peopleAppName = value;
}
setGroupAppName(value: string): void {
this.groupAppName = value;
}
setPeopleGroupsRestriction(value: string): void {
this.groupsRestriction = this.getArrayFromString(value);
}
onChangePeopleMode(event: MatRadioChange): void {
this.peopleMode = event.value;
}
onChangePeopleReadonly(event: MatCheckboxChange): void {
this.peopleReadonly = event.checked;
}
onChangeGroupReadonly(event: MatCheckboxChange): void {
this.groupReadonly = event.checked;
}
onChangeGroupsMode(event: MatRadioChange): void {
this.groupMode = event.value;
}
onChangePeopleFilterMode(event: MatRadioChange): void {
this.peopleFilterMode = event.value;
this.resetPeopleFilter();
}
onChangeGroupsFilterMode(event: MatRadioChange): void {
this.groupFilterMode = event.value;
this.restGroupFilter();
}
isPeopleAppNameSelected(): boolean {
return this.peopleFilterMode === 'appName';
}
isGroupAppNameSelected(): boolean {
return this.groupFilterMode === 'appName';
}
resetPeopleFilter(): void {
if (this.isPeopleAppNameSelected()) {
this.peopleRoles = [];
} else {
this.peopleAppName = '';
}
}
restGroupFilter(): void {
if (this.isGroupAppNameSelected()) {
this.groupRoles = [];
} else {
this.groupAppName = '';
}
}
onChangePeopleValidation(event: MatCheckboxChange): void {
this.peoplePreselectValidation = event.checked;
}
onChangeGroupValidation(event: MatCheckboxChange): void {
this.groupPreselectValidation = event.checked;
}
onGroupsWarning(warning: any): void {
this.invalidGroups = warning.groups;
}
onUsersWarning(warning: any): void {
this.invalidUsers = warning.users;
}
isStringArray(str: string): boolean {
try {
const result = JSON.parse(str);
return Array.isArray(result);
} catch (e) {
return false;
}
}
private getArrayFromString<T = any>(value: string): T[] {
if (this.isStringArray(value)) {
return JSON.parse(value);
} else {
return [];
}
}
}

View File

@ -1,38 +0,0 @@
<adf-cloud-service-task-filters
[appName]="appName"
[filterParam]="{index: 0}"
(filterClicked)="onTaskFilterSelected($event)"
(filterSelected)="onTaskFilterSelected($event)">
</adf-cloud-service-task-filters>
<div class="app-task-list-with-filter">
<adf-cloud-edit-service-task-filter
[id]="filterId"
[appName]="appName"
[filterProperties]="taskFilterProperties.filterProperties"
[sortProperties]="taskFilterProperties.sortProperties"
[actions]="taskFilterProperties.actions"
(filterChange)="onFilterChange($event)">
</adf-cloud-edit-service-task-filter>
<div
class="app-task-list-container"
*ngIf="editedFilter">
<adf-cloud-service-task-list
#taskCloud
[queryParams]="editedFilter"
class="app-cloud-layout-overflow"
[appName]="editedFilter.appName"
[sorting]="sortArray"
[multiselect]="multiselect"
[selectionMode]="selectionMode"
[stickyHeader]="true"
[showActions]="actionMenu"
[showContextMenu]="contextMenu">
</adf-cloud-service-task-list>
<adf-pagination
[target]="taskCloud"
(changePageSize)="onChangePageSize($event)"
(nextPage)="resetSelectedRows()"
(prevPage)="resetSelectedRows()">
</adf-pagination>
</div>
</div>

View File

@ -1,25 +0,0 @@
app-service-task-list-cloud-demo {
min-height: 100%;
min-width: 100%;
display: flex;
.app-task-list-with-filter, .app-task-list-container {
flex-direction: column;
display: flex;
flex: 1;
}
&, .app-task-list-container {
height: 100%;
width: 100%;
}
.app-task-list-container {
place-content: stretch space-between;
align-items: stretch;
.app-cloud-layout-overflow {
flex: 1;
}
}
}

View File

@ -1,114 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';
import {
ServiceTaskFilterCloudModel,
ServiceTaskListCloudComponent,
TaskListCloudSortingModel
} from '@alfresco/adf-process-services-cloud';
import { AppConfigService, PaginationModel, UserPreferencesService } from '@alfresco/adf-core';
import { CloudLayoutService, CloudServiceSettings } from './services/cloud-layout.service';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
const TASK_FILTER_PROPERTY_KEYS = 'adf-edit-service-task-filter';
@Component({
selector: 'app-service-task-list-cloud-demo',
templateUrl: './service-task-list-cloud-demo.component.html',
styleUrls: ['./service-task-list-cloud-demo.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class ServiceTaskListCloudDemoComponent implements OnInit, OnDestroy {
@ViewChild('taskCloud')
taskCloud: ServiceTaskListCloudComponent;
appName = 'simpleapp';
isFilterLoaded = false;
selectedRow: any;
sortArray: TaskListCloudSortingModel[];
editedFilter: ServiceTaskFilterCloudModel;
taskFilterProperties: any = { filterProperties: [], sortProperties: [], actions: [] };
multiselect: boolean;
selectedRows: string[] = [];
actionMenu: boolean;
contextMenu: boolean;
actions: any[] = [];
selectedAction: { id: number; name: string; actionType: string};
selectedContextAction: { id: number; name: string; actionType: string};
selectionMode: string;
filterId: string;
private onDestroy$ = new Subject<boolean>();
constructor(
private cloudLayoutService: CloudLayoutService,
private userPreference: UserPreferencesService,
private appConfig: AppConfigService) {
const properties = this.appConfig.get<Array<any>>(TASK_FILTER_PROPERTY_KEYS);
if (properties === this.taskFilterProperties) {
this.taskFilterProperties = properties;
}
}
ngOnInit() {
this.isFilterLoaded = false;
this.cloudLayoutService.settings$
.pipe(takeUntil(this.onDestroy$))
.subscribe(settings => this.setCurrentSettings(settings));
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
setCurrentSettings(settings: CloudServiceSettings) {
if (settings) {
this.multiselect = settings.multiselect;
this.selectionMode = settings.selectionMode;
this.actionMenu = settings.actionMenu;
this.contextMenu = settings.contextMenu;
this.actions = settings.actions;
}
}
onTaskFilterSelected(filter: ServiceTaskFilterCloudModel) {
this.filterId = filter.id;
this.editedFilter = filter;
}
onChangePageSize(event: PaginationModel) {
this.userPreference.paginationSize = event.maxItems;
}
resetSelectedRows() {
this.selectedRows = [];
}
onFilterChange(filter: ServiceTaskFilterCloudModel) {
this.appName = filter.appName;
this.editedFilter = Object.assign({}, filter);
this.sortArray = [new TaskListCloudSortingModel({ orderBy: this.editedFilter.sort, direction: this.editedFilter.order })];
}
}

View File

@ -1,27 +0,0 @@
<h2>Task Header Cloud</h2>
<mat-form-field class="app-appName-input">
App name
<input matInput
[type]="'text'"
[formControl]="appNameFormControl"
(change)="updateTaskHeader()">
</mat-form-field>
<mat-form-field class="app-taskId-input">
Task id
<input matInput
[type]="'text'"
[formControl]="taskIdFormControl"
(change)="updateTaskHeader()">
</mat-form-field>
<mat-error *ngIf="errorMessage">{{errorMessage}}</mat-error>
<div>
<adf-cloud-task-header #taskHeader
[appName]="appName"
[taskId]="taskId"
(error)="onError($event)">
</adf-cloud-task-header>
</div>

View File

@ -1,15 +0,0 @@
.app {
&-appName-input {
width: 500px;
margin-right: 50px;
}
&-taskId-input {
width: 500px;
}
&-find-task-button {
background-color: #ff9800;
margin-left: 30px;
}
}

View File

@ -1,49 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, ViewChild } from '@angular/core';
import { TaskHeaderCloudComponent } from '@alfresco/adf-process-services-cloud';
import { UntypedFormControl } from '@angular/forms';
@Component({
templateUrl: './task-header-cloud-demo.component.html',
styleUrls: ['./task-header-cloud-demo.component.scss']
})
export class TaskHeaderCloudDemoComponent {
@ViewChild('taskHeader', { static: true })
taskHeader: TaskHeaderCloudComponent;
appName: string;
taskId: string;
errorMessage;
appNameFormControl = new UntypedFormControl('');
taskIdFormControl = new UntypedFormControl('');
constructor() {}
updateTaskHeader() {
this.errorMessage = undefined;
this.appName = this.appNameFormControl.value;
this.taskId = this.taskIdFormControl.value;
}
onError(error) {
this.errorMessage = error;
}
}

View File

@ -1,49 +0,0 @@
<div>
<mat-nav-list class="app-list-confgurations">
<mat-list-item (click)="appConfigClick()">
<a matLine id="adf-app-conf">App Config Editor</a>
<button mat-icon-button>
<mat-icon>info</mat-icon>
</button>
</mat-list-item>
<mat-list-item (click)="infinitePaginationConfClick()">
<a matLine id="adf-infinite-pagination-conf">Infinite pagination</a>
<button mat-icon-button>
<mat-icon>info</mat-icon>
</button>
</mat-list-item>
<mat-list-item (click)="supportedPageSizesClick()">
<a matLine id="adf-supported-page-size">Supported Page Sizes </a>
<button mat-icon-button>
<mat-icon>info</mat-icon>
</button>
</mat-list-item>
<mat-list-item (click)="textOrientationClick()">
<a matLine id="adf-page-orientation-conf">Page Orientation</a>
<button mat-icon-button>
<mat-icon>info</mat-icon>
</button>
</mat-list-item>
</mat-nav-list>
<div>
<ngx-monaco-editor id="adf-code-configuration-editor"
class="app-file-editor"
[options]="editorOptions"
[(ngModel)]="code"
(onInit)="onInit($event)">
</ngx-monaco-editor>
<div class="app-list-confgurations-buttons">
<button mat-raised-button id="adf-configuration-save" (click)="onSave()" color="primary">
Save
</button>
<button mat-raised-button id="adf-configuration-clear" (click)="onClear()" color="primary">
Clear
</button>
</div>
</div>
</div>

View File

@ -1,16 +0,0 @@
.app-file-editor {
height: 500px;
width: 65%;
float: left;
}
.app-list-configurations {
float: left;
width: 30%;
}
.app-list-configurations-buttons {
width: 200px;
margin-left: 30%;
float: left;
}

View File

@ -1,143 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, OnDestroy } from '@angular/core';
import {
AppConfigService,
NotificationService,
UserPreferencesService,
UserPreferenceValues
} from '@alfresco/adf-core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@Component({
selector: 'app-config-editor',
templateUrl: './config-editor.component.html',
styleUrls: ['./config-editor.component.scss']
})
export class ConfigEditorComponent implements OnDestroy {
private onDestroy$ = new Subject<boolean>();
editor: any;
code: any;
field: string;
invalidJson = false;
isUserPreference = false;
userPreferenceProperty: string;
editorOptions = {
theme: 'vs-dark',
language: 'json',
autoIndent: true,
formatOnPaste: true,
formatOnType: true
};
onInit(editor) {
this.editor = editor;
this.indentCode();
}
constructor(private appConfig: AppConfigService,
private userPreferencesService: UserPreferencesService,
private notificationService: NotificationService) {
this.code = JSON.stringify(appConfig.config);
}
onSave() {
try {
if (this.isUserPreference) {
this.userPreferencesService.set(this.userPreferenceProperty, JSON.parse(this.editor.getValue()));
} else {
this.appConfig.config = JSON.parse(this.editor.getValue());
}
} catch (error) {
this.invalidJson = true;
this.notificationService.openSnackMessage('Wrong Code configuration ' + error);
} finally {
if (!this.invalidJson) {
this.notificationService.openSnackMessage('Saved');
}
}
}
onClear() {
this.code = '';
}
appConfigClick() {
this.isUserPreference = false;
this.code = JSON.stringify(this.appConfig.config);
this.indentCode();
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
textOrientationClick() {
this.isUserPreference = true;
this.userPreferenceProperty = 'textOrientation';
this.userPreferencesService
.select(this.userPreferenceProperty)
.pipe(takeUntil(this.onDestroy$))
.subscribe((textOrientation: number) => {
this.code = JSON.stringify(textOrientation);
this.field = 'textOrientation';
this.indentCode();
});
this.indentCode();
}
infinitePaginationConfClick() {
this.isUserPreference = true;
this.userPreferenceProperty = UserPreferenceValues.PaginationSize;
this.userPreferencesService
.select(this.userPreferenceProperty)
.pipe(takeUntil(this.onDestroy$))
.subscribe((pageSize: number) => {
this.code = JSON.stringify(pageSize);
this.field = 'adf-infinite-pagination';
this.indentCode();
});
}
supportedPageSizesClick() {
this.isUserPreference = true;
this.userPreferenceProperty = UserPreferenceValues.SupportedPageSizes;
this.userPreferencesService
.select(this.userPreferenceProperty)
.pipe(takeUntil(this.onDestroy$))
.subscribe((supportedPageSizes: number) => {
this.code = JSON.stringify(supportedPageSizes);
this.field = 'adf-supported-page-size';
this.indentCode();
});
}
indentCode() {
setTimeout(() => {
this.editor.getAction('editor.action.formatDocument').run();
}, 300);
}
}

View File

@ -1,41 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { NgModule } from '@angular/core';
import { ConfigEditorComponent } from './config-editor.component';
import { Routes, RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { MonacoEditorModule } from 'ngx-monaco-editor-v2';
const routes: Routes = [
{
path: '',
component: ConfigEditorComponent
}
];
@NgModule({
imports: [
CommonModule,
CoreModule,
RouterModule.forChild(routes),
MonacoEditorModule
],
declarations: [ConfigEditorComponent]
})
export class AppConfigEditorModule {}

View File

@ -1,24 +0,0 @@
<adf-toolbar>
<adf-toolbar-title>
<mat-form-field>
<mat-select [(ngModel)]="selectedSource" data-automation-id="custom-sources-select">
<mat-option *ngFor="let source of sources" [value]="source.value">
{{ source.title }}
</mat-option>
</mat-select>
</mat-form-field>
</adf-toolbar-title>
<adf-toolbar-divider></adf-toolbar-divider>
<button mat-icon-button
[disabled]="!hasSelection(customSourcesDocumentList.selection)"
title="Download"
[adfNodeDownload]="customSourcesDocumentList.selection">
<mat-icon>get_app</mat-icon>
</button>
</adf-toolbar>
<adf-document-list
#customSourcesDocumentList
[currentFolderId]="selectedSource"
locationFormat="/files"
selectionMode="multiple">
</adf-document-list>

View File

@ -1,49 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, Input, ViewChild, ViewEncapsulation } from '@angular/core';
import { DocumentListComponent } from '@alfresco/adf-content-services';
@Component({
selector: 'app-custom-sources',
templateUrl: './custom-sources.component.html',
encapsulation: ViewEncapsulation.None
})
export class CustomSourcesComponent {
@Input()
selectedSource = '-recent-';
@ViewChild('customSourcesDocumentList', { static: true })
documentList: DocumentListComponent;
sources = [
{ title: 'Favorites', value: '-favorites-' },
{ title: 'Recent', value: '-recent-' },
{ title: 'Shared Links', value: '-sharedlinks-' },
{ title: 'Sites', value: '-sites-' },
{ title: 'My Sites', value: '-mysites-' },
{ title: 'Trashcan', value: '-trashcan-' },
{ title: 'Root', value: '-root-' },
{ title: 'My', value: '-my-' },
{ title: 'Shared', value: '-shared-' }
];
hasSelection(selection: any[]): boolean {
return selection && selection.length > 0;
}
}

View File

@ -1,41 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { NgModule } from '@angular/core';
import { CustomSourcesComponent } from './custom-sources.component';
import { Routes, RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { ContentModule } from '@alfresco/adf-content-services';
const routes: Routes = [
{
path: '',
component: CustomSourcesComponent
}
];
@NgModule({
imports: [
CommonModule,
RouterModule.forChild(routes),
CoreModule,
ContentModule.forChild()
],
declarations: [CustomSourcesComponent]
})
export class AppCustomSourcesModule {}

View File

@ -50,23 +50,6 @@
[adf-create-folder]="currentFolderId">
<mat-icon>create_new_folder</mat-icon>
</button>
<button
mat-icon-button
title="Create Library}"
data-automation-id="create-new-library"
(click)="createLibrary()">
<mat-icon>library_add</mat-icon>
</button>
<button
data-automation-id="edit-folder"
mat-icon-button
[disabled]="!canEditFolder(documentList.selection)"
title="Edit folder"
(error)="openSnackMessageError($event)"
[adf-edit-folder]="documentList.selection[0]?.entry"
(success)="documentList.reload()">
<mat-icon>create</mat-icon>
</button>
<button mat-icon-button
[disabled]="!hasSelection(documentList.selection)"
title="Download"
@ -83,23 +66,6 @@
[adf-delete]="documentList.selection">
<mat-icon>delete</mat-icon>
</button>
<button
data-automation-id="favorite"
mat-icon-button
[disabled]="!documentList.selection.length"
#favorite="adfFavorite"
[adf-node-favorite]="documentList.selection"
title="Add to favorites">
<mat-icon>{{ favorite.hasFavorites() ? 'star' :'star_border' }}</mat-icon>
</button>
<button mat-icon-button
[disabled]="documentList.selection.length && !shareRef.isFile"
[baseShareUrl]="baseShareUrl"
#shareRef="adfShare"
[adf-share]="documentList.selection[0]"
[title]="(shareRef.isShared ? 'Edit settings' : 'Share')">
<mat-icon>share</mat-icon>
</button>
</div>
<button mat-icon-button (click)="showVersions = !showVersions" class="app-show-versions-button"
@ -124,11 +90,6 @@
<mat-icon>create_new_folder</mat-icon>
<span>New folder</span>
</button>
<button mat-menu-item
(click)="createLibrary()">
<mat-icon>library_add</mat-icon>
<span>Create Library</span>
</button>
<button mat-menu-item
[disabled]="!canEditFolder(documentList.selection)"
(error)="openSnackMessageError($event)"
@ -270,24 +231,6 @@
title="Download"
handler="download">
</content-action>
<content-action
icon="content_copy"
title="Copy"
permission="copy"
[disableWithNoPermission]="true"
(error)="onContentActionError($event)"
(success)="onContentActionSuccess($event)"
handler="copy">
</content-action>
<content-action
icon="redo"
title="Move"
permission="update"
[disableWithNoPermission]="true"
(error)="onContentActionError($event)"
(success)="onContentActionSuccess($event)"
handler="move">
</content-action>
<content-action
icon="delete"
permission="delete"
@ -316,13 +259,6 @@
title="Manage versions"
(execute)="onManageVersions($event)">
</content-action>
<content-action
target="document"
icon="lock"
permission="lock"
handler="lock"
title="Lock">
</content-action>
<content-action
icon="beach_access"
target="document"
@ -450,12 +386,6 @@
</mat-slide-toggle>
</section>
<section>
<mat-slide-toggle id="adf-document-list-enable-drop-files" [checked]="allowDropFiles" (change)="toggleAllowDropFiles()">
Enable Drop Files in a folder or a file
</mat-slide-toggle>
</section>
<section>
<mat-slide-toggle id="adf-version-upload-switch" [(ngModel)]="versioning">
Enable versioning
@ -504,39 +434,6 @@
</mat-slide-toggle>
</section>
<section>
<mat-slide-toggle [(ngModel)]="enableDownloadPrompt" id="enableDownloadPrompt" (change)="onEnableDownloadPrompt()">
Enable Download Prompt
</mat-slide-toggle>
</section>
<section *ngIf="enableDownloadPrompt">
<mat-form-field>
<input matInput type="number" [(ngModel)]="downloadPromptDelay" (change)="onDownloadPromptDelayChange()">
</mat-form-field>
</section>
<section *ngIf="enableDownloadPrompt">
<mat-slide-toggle [(ngModel)]="enableDownloadPromptReminder" id="enableDownloadPromptReminders" (change)="onEnableDownloadPromptReminderChange()">
Enable Download Prompt Reminders
</mat-slide-toggle>
</section>
<section *ngIf="enableDownloadPrompt && enableDownloadPromptReminder">
<mat-form-field>
<input matInput type="number" [(ngModel)]="downloadPromptReminderDelay" (change)="onDownloadPromptReminderChange()">
</mat-form-field>
</section>
<section>
<mat-slide-toggle [(ngModel)]="enableFileAutoDownload" id="enableFileAutoDownload" (change)="onEnableFileAutoDownloadChange()">
Enable FileAutoDownload
</mat-slide-toggle>
</section>
<section *ngIf="enableFileAutoDownload">
<mat-form-field>
<input matInput type="number" [(ngModel)]="fileAutoDownloadSizeThresholdInMB" (change)="onFileAutoDownloadSizeThresholdChange()">
</mat-form-field>
</section>
<h5>Upload</h5>
<section *ngIf="acceptedFilesTypeShow">
<mat-form-field floatPlaceholder="float">
@ -555,7 +452,6 @@
<div *ngIf="!acceptedFilesTypeShow">
<adf-upload-button
#uploadButton
tooltip="Custom tooltip"
[disabled]="!enableUpload"
[rootFolderId]="documentList.currentFolderId"
[multipleFiles]="multipleFileUpload"
@ -572,7 +468,6 @@
<div *ngIf="acceptedFilesTypeShow">
<adf-upload-button
#uploadButton
tooltip="Custom tooltip"
[disabled]="!enableUpload"
[rootFolderId]="documentList.currentFolderId"
[acceptedFilesType]="acceptedFilesType"

View File

@ -31,17 +31,8 @@ import {
import { Location } from '@angular/common';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { MinimalNodeEntity, NodePaging, Pagination, MinimalNodeEntryEntity, SiteEntry, SearchEntry } from '@alfresco/js-api';
import {
MinimalNodeEntity,
NodePaging,
Pagination,
MinimalNodeEntryEntity,
SiteEntry,
SearchEntry
} from '@alfresco/js-api';
import {
AppConfigService,
AppConfigValues,
NotificationService,
DataRow,
UserPreferencesService,
@ -60,13 +51,11 @@ import {
PermissionStyleModel,
UploadFilesEvent,
ConfirmDialogComponent,
LibraryDialogComponent,
ContentMetadataService,
FilterSearch,
DialogAspectListService,
FileUploadEvent,
NodesApiService,
SharedLinksApiService
NodesApiService
} from '@alfresco/adf-content-services';
import { ProcessFormRenderingService } from '@alfresco/adf-process-services';
import { VersionManagerDialogAdapterComponent } from './version-manager-dialog-adapter.component';
@ -98,10 +87,6 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
displayMode = DisplayMode.List;
includeFields = ['isFavorite', 'isLocked', 'aspectNames', 'definition'];
baseShareUrl = (
this.appConfig.get<string>(AppConfigValues.BASESHAREURL) ||
this.appConfig.get<string>(AppConfigValues.ECMHOST)) + '/preview/s/';
selectionModes = [
{value: 'none', viewValue: 'None'},
{value: 'single', viewValue: 'Single'},
@ -232,25 +217,16 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
displayEmptyMetadata = false;
hyperlinkNavigation = false;
enableDownloadPrompt = this.appConfig.get<boolean>('viewer.enableDownloadPrompt', false);
enableDownloadPromptReminder: boolean = this.appConfig.get('viewer.enableDownloadPromptReminders', false);
downloadPromptDelay = this.appConfig.get('viewer.downloadPromptDelay', 50);
downloadPromptReminderDelay = this.appConfig.get('viewer.downloadPromptReminderDelay', 30);
enableFileAutoDownload: boolean = this.appConfig.get('viewer.enableFileAutoDownload', true);
fileAutoDownloadSizeThresholdInMB: number = this.appConfig.get('viewer.fileAutoDownloadSizeThresholdInMB', 15);
constructor(private notificationService: NotificationService,
private uploadService: UploadService,
private contentService: ContentService,
private dialog: MatDialog,
private location: Location,
private router: Router,
private appConfig: AppConfigService,
private preference: UserPreferencesService,
private preview: PreviewService,
@Optional() private route: ActivatedRoute,
private contentMetadataService: ContentMetadataService,
private sharedLinksApiService: SharedLinksApiService,
private dialogAspectListService: DialogAspectListService,
private nodeService: NodesApiService) {
}
@ -267,11 +243,6 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
this.documentList.reload();
}
toggleAllowDropFiles() {
this.allowDropFiles = !this.allowDropFiles;
this.documentList.reload();
}
ngOnInit() {
if (!this.pagination) {
this.pagination = {
@ -323,12 +294,6 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
.subscribe((err: { message: string }) => {
this.notificationService.showError(err.message);
});
this.sharedLinksApiService.error
.pipe(takeUntil(this.onDestroy$))
.subscribe((err: { message: string }) => {
this.notificationService.showError(err.message);
});
}
onFileUploadEvent(event: FileUploadEvent) {
@ -433,11 +398,6 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
this.openSnackMessageError(message);
}
onContentActionSuccess(message: string) {
this.openSnackMessageInfo(message);
this.documentList.reload();
}
onDeleteActionSuccess(message: string) {
this.uploadService.fileDeleted.next(message);
this.deleteElementSuccess.emit();
@ -624,16 +584,6 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
return this.acceptedFilesTypeShow ? this.acceptedFilesType : '*';
}
createLibrary(): void {
const dialogInstance: any = this.dialog.open(LibraryDialogComponent, {
width: '400px'
});
dialogInstance.componentInstance.error.subscribe((message: string) => {
this.notificationService.openSnackMessage(message);
});
}
searchResultsHighlight(search: SearchEntry): string {
if (search && search.highlight) {
return search.highlight.map((currentHighlight) => currentHighlight.snippets).join(', ');
@ -673,34 +623,4 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
}
this.documentList.reload();
}
onEnableDownloadPrompt() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['enableDownloadPrompt'] = this.enableDownloadPrompt;
}
onDownloadPromptDelayChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['downloadPromptDelay'] = this.downloadPromptDelay;
}
onEnableDownloadPromptReminderChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['enableDownloadPromptReminder'] = this.enableDownloadPromptReminder;
}
onDownloadPromptReminderChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['downloadPromptReminderDelay'] = this.downloadPromptReminderDelay;
}
onEnableFileAutoDownloadChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['enableFileAutoDownload'] = this.enableFileAutoDownload;
}
onFileAutoDownloadSizeThresholdChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['fileAutoDownloadSizeThresholdInMB'] = this.fileAutoDownloadSizeThresholdInMB;
}
}

View File

@ -1,54 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Observable, of } from 'rxjs';
import { Injectable } from '@angular/core';
import {
TaskFormService
} from '@alfresco/adf-process-services';
import { AlfrescoApiService, LogService } from '@alfresco/adf-core';
@Injectable()
export class FakeTaskFormService extends TaskFormService {
constructor(apiService: AlfrescoApiService, logService: LogService) {
super(apiService, logService);
}
public getRestFieldValues(
taskId: string,
fieldId: string
): Observable<any> {
if (fieldId === 'typeaheadField') {
return of([
{ id: '1', name: 'Leanne Graham' },
{ id: '2', name: 'Ervin Howell' },
{ id: '3', name: 'Clementine Bauch' },
{ id: '4', name: 'Patricia Lebsack' },
{ id: '5', name: 'Chelsey Dietrich' },
{ id: '6', name: 'Mrs. Dennis Schulist' },
{ id: '7', name: 'Kurtis Weissnat' },
{ id: '8', name: 'Nicholas Runolfsdottir V' },
{ id: '9', name: 'Glenna Reichert' },
{ id: '10', name: 'Clementina DuBuque' }
]);
} else {
return super.getRestFieldValues(taskId, fieldId);
}
}
}

View File

@ -1,11 +0,0 @@
<adf-form-list [forms]="formList" (row-dblclick)="onRowDblClick($any($event))">
</adf-form-list>
<div class="app-form-container" *ngIf="!isEmptyForm()">
<adf-form #adfForm [form]="form" [data]="restoredData" [showValidationIcon]="showValidationIcon">
</adf-form>
</div>
<button mat-button (click)="store()">Store</button>
<button mat-button (click)="restore()">Restore</button>
<section class="app-form-list-margin">
<mat-slide-toggle [(ngModel)]="showValidationIcon">Show Validation Icon</mat-slide-toggle>
</section>

View File

@ -1,12 +0,0 @@
.app-form-container {
padding: 10px;
}
.app-store-form-container {
width: 80%;
height: 80%;
}
.app-form-list-margin {
margin-left: 26px;
}

View File

@ -1,100 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, ViewChild, OnDestroy, OnInit } from '@angular/core';
import { FormModel, FormService, LogService, FormOutcomeEvent } from '@alfresco/adf-core';
import { FormComponent, EditorService } from '@alfresco/adf-process-services';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@Component({
selector: 'app-form-list',
templateUrl: './form-list.component.html',
styleUrls: ['./form-list.component.scss']
})
export class FormListComponent implements OnInit, OnDestroy {
@ViewChild('adfForm')
activitiForm: FormComponent;
formList: any [] = [];
form: FormModel;
formId: string;
storedData: any = {};
restoredData: any = {};
showValidationIcon = false;
private onDestroy$ = new Subject<boolean>();
constructor(private formService: FormService, private editorService: EditorService, private logService: LogService) {
}
ngOnInit() {
// Prevent default outcome actions
this.formService.executeOutcome
.pipe(takeUntil(this.onDestroy$))
.subscribe((formOutcomeEvent: FormOutcomeEvent) => {
formOutcomeEvent.preventDefault();
this.logService.log(formOutcomeEvent.outcome);
});
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
onRowDblClick(event: CustomEvent<any>) {
const rowForm = event.detail.value.obj;
this.editorService.getFormDefinitionById(rowForm.id).subscribe((formModel) => {
const form = this.formService.parseForm(formModel.formDefinition);
this.form = form;
});
this.logService.log(rowForm);
}
isEmptyForm() {
return this.form === null || this.form === undefined;
}
store() {
this.clone(this.activitiForm.form.values, this.storedData);
this.logService.log('DATA SAVED');
this.logService.log(this.storedData);
this.logService.log('DATA SAVED');
this.restoredData = null;
}
clone(objToCopyFrom, objToCopyTo) {
for (const attribute in objToCopyFrom) {
if (objToCopyFrom.hasOwnProperty(attribute)) {
objToCopyTo[attribute] = objToCopyFrom[attribute];
}
}
return objToCopyTo;
}
restore() {
this.restoredData = this.storedData;
this.storedData = {};
}
}

View File

@ -1,31 +0,0 @@
<div class="app-form-container">
<mat-accordion>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title>Form Data</mat-panel-title>
<mat-panel-description>Enter values to populate the form</mat-panel-description>
</mat-expansion-panel-header>
<mat-list>
<mat-list-item>
<mat-form-field>
<input matInput placeholder="Typeahead" [(ngModel)]="typeaheadFieldValue">
</mat-form-field>
</mat-list-item>
<mat-list-item>
<mat-form-field>
<input matInput placeholder="DropDown" [(ngModel)]="selectFieldValue">
</mat-form-field>
</mat-list-item>
<mat-list-item>
<mat-form-field>
<input matInput placeholder="Radio Button" [(ngModel)]="radioButtonFieldValue">
</mat-form-field>
</mat-list-item>
</mat-list>
<button mat-button color="primary" (click)="onLoadButtonClicked()">Load</button>
</mat-expansion-panel>
</mat-accordion>
<mat-divider></mat-divider>
<adf-form [showRefreshButton]="false" [form]="form" [data]="formattedData">
</adf-form>
</div>

View File

@ -1,3 +0,0 @@
.app-form-container {
padding: 10px;
}

View File

@ -1,77 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, Inject, OnInit, OnDestroy } from '@angular/core';
import {
FormModel,
FormService,
FormOutcomeEvent,
CoreAutomationService
} from '@alfresco/adf-core';
import {
TaskFormService
} from '@alfresco/adf-process-services';
import { InMemoryFormService } from '../../services/in-memory-form.service';
import { FakeTaskFormService } from './fake-tak-form.service';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@Component({
selector: 'app-form-loading',
templateUrl: './form-loading.component.html',
styleUrls: ['./form-loading.component.scss'],
providers: [{ provide: FakeTaskFormService, useClass: TaskFormService }]
})
export class FormLoadingComponent implements OnInit, OnDestroy {
form: FormModel;
typeaheadFieldValue = '';
selectFieldValue = '';
radioButtonFieldValue = '';
formattedData = {};
private onDestroy$ = new Subject<boolean>();
constructor(
@Inject(FormService) private formService: InMemoryFormService,
private automationService: CoreAutomationService
) {}
ngOnInit() {
this.formService.executeOutcome
.pipe(takeUntil(this.onDestroy$))
.subscribe((formOutcomeEvent: FormOutcomeEvent) => {
formOutcomeEvent.preventDefault();
});
this.formattedData = {};
const formDefinitionJSON: any = this.automationService.forms.getSimpleFormDefinition();
this.form = this.formService.parseForm(formDefinitionJSON);
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
onLoadButtonClicked() {
this.formattedData = {
typeaheadField: this.typeaheadFieldValue,
selectBox: this.selectFieldValue,
radioButton: this.radioButtonFieldValue
};
}
}

View File

@ -1,20 +1,18 @@
<div class="main-content">
<mat-tab-group>
<mat-tab-group [animationDuration]="'0'">
<mat-tab label="Form">
<div class="app-form-container">
<adf-form
[showRefreshButton]="false"
[form]="form"
[enableFixedSpacedForm]="keepPrefixedSpace"
(formError)="logErrors($event)">
</adf-form>
</div>
<div class="app-console" #console>
<h3>Error log:</h3>
<p *ngFor="let error of errorFields">Error {{ error.name }} {{error.validationSummary.message |
translate}}</p>
<p *ngFor="let error of errorFields">Error {{ error.name }} {{error.validationSummary.message | translate}}</p>
</div>
</mat-tab>
<mat-tab label="Editor">
@ -26,15 +24,11 @@
(onInit)="onInitFormEditor($event)">
</ngx-monaco-editor>
<div class="app-form-editor-buttons">
<button mat-raised-button id="app-form-config-save" (click)="onSaveFormConfig()" color="primary">Save
form config
</button>
<button mat-raised-button id="app-form-config-clear" (click)="onClearFormConfig()" color="primary">Clear
form config
</button>
<button mat-raised-button id="app-form-config-save" (click)="onSaveFormConfig()">Save form config</button>
<button mat-raised-button id="app-form-config-clear" (click)="onClearFormConfig()">Clear form config</button>
</div>
<div class="app-upload-config-button">
<a mat-raised-button color="primary" >
<a mat-raised-button>
<mat-icon>file_upload</mat-icon>
<label for="upload-config-file">Upload JSON File</label>
<input
@ -46,14 +40,7 @@
(change)="onConfigAdded($event)">
</a>
</div>
</mat-tab>
<mat-tab label="Options">
<mat-slide-toggle [checked]="keepPrefixedSpace" (change)="togglePrefixedSpace()" >
Keep prefixed space for hidden field
</mat-slide-toggle>
</mat-tab>
</mat-tab-group>
</div>

View File

@ -33,12 +33,10 @@ import { takeUntil } from 'rxjs/operators';
encapsulation: ViewEncapsulation.None
})
export class FormComponent implements OnInit, OnDestroy {
form: FormModel;
errorFields: FormFieldModel[] = [];
formConfig: string;
editor: any;
keepPrefixedSpace = true;
editorOptions = {
theme: 'vs-dark',
@ -86,7 +84,7 @@ export class FormComponent implements OnInit, OnDestroy {
}
parseForm() {
this.form = this.formService.parseForm(JSON.parse(this.formConfig), null, false, this.keepPrefixedSpace);
this.form = this.formService.parseForm(JSON.parse(this.formConfig), null, false, true);
}
onSaveFormConfig() {
@ -114,8 +112,4 @@ export class FormComponent implements OnInit, OnDestroy {
$event.target.value = '';
}
togglePrefixedSpace() {
this.keepPrefixedSpace = !this.keepPrefixedSpace;
}
}

View File

@ -64,9 +64,7 @@
</mat-error>
</mat-form-field>
<div class="app-reset-button">
<button mat-raised-button (click)="resetProcessForm()">Reset</button>
</div>
<button mat-raised-button (click)="resetProcessForm()">Reset</button>
</form>
</div>

View File

@ -7,14 +7,3 @@
width: calc(100% * (1 / 4) - 10px);
}
}
.app-reset-button {
margin-bottom: 50px;
display: flex;
justify-content: center;
}
.app-process-list-error-message {
color: var(--theme-warn-color);
text-align: center;
}

View File

@ -1,288 +1,174 @@
<mat-tab-group [(selectedIndex)]="activeTab" (selectedTabChange)="onTabChange($event)"
data-automation-id="navigation-bar">
<mat-tab id="app-tasks-header" href="#tasks" label="Tasks">
<div class="app-page-content" *ngIf="showTaskTab">
<div class="app-grid">
<div class="app-grid-item app-tasks-menu">
<div class="app-list-buttons">
<adf-sidebar-action-menu [expanded]="true" [width]="205" title="CREATE">
<mat-icon sidebar-menu-title-icon>arrow_drop_down</mat-icon>
<div adf-sidebar-menu-options>
<button mat-menu-item data-automation-id="btn-start-task" (click)="navigateStartTask()">
<mat-icon>assessment</mat-icon>
<span>New Task</span>
</button>
</div>
</adf-sidebar-action-menu>
</div>
<mat-accordion class="app-accordion-panel" displayMode="flat">
<mat-expansion-panel class="mat-elevation-z0" [expanded]="true">
<mat-expansion-panel-header>
<mat-panel-title>
<mat-icon>assignment</mat-icon>
<div id="tasks-accordion-title" class="app-accordion-title-padding">Tasks</div>
</mat-panel-title>
</mat-expansion-panel-header>
<adf-task-filters [filterParam]="filterSelected"
role="group"
aria-labelledby="tasks-accordion-title"
[appId]="appId"
[showIcon]="showTaskFilterIcon"
(filterClicked)="onTaskFilterClick($event)"
(filterSelected)="onTaskFilterClick($event)"
(success)="onSuccessTaskFilterList()" #activitiFilter>
</adf-task-filters>
</mat-expansion-panel>
</mat-accordion>
</div>
<div
class="app-grid-item app-tasks-list"
*ngIf="taskFilter && !isStartTaskMode()">
<adf-tasklist
[appId]="taskFilter?.appId"
[presetColumn]="presetColumn"
[page]="taskPage"
[size]="paginationPageSize"
[selectionMode]="selectionMode"
[name]="taskFilter?.filter?.name"
[assignment]="taskFilter?.filter?.assignment"
[state]="taskFilter?.filter?.state"
[sort]="taskFilter?.filter?.sort"
[landingTaskId]="currentTaskId"
[showContextMenu]="taskContextMenu"
(showRowContextMenu)="onShowTaskRowContextMenu($event)"
(rowClick)="onTaskRowClick($event)"
(success)="onSuccessTaskList()"
(row-click)="onRowClick($event)"
(row-dblclick)="onTaskRowDblClick($any($event))"
[multiselect]="multiSelectTask"
#taskList>
</adf-tasklist>
<adf-pagination
*ngIf="taskList"
[target]="taskList"
(changePageSize)="onChangePageSize($event)"
#taskListPagination>
</adf-pagination>
</div>
<div
class="app-grid-item app-tasks-details"
*ngIf="!isStartTaskMode()"
data-automation-id="app-tasks-details">
<adf-task-details #activitiDetails
[debugMode]="true"
[taskId]="currentTaskId"
[showFormTitle]="true"
[fieldValidators]="fieldValidators"
[showHeaderContent]="showHeaderContent"
(formCompleted)="onFormCompleted()"
(formContentClicked)="onContentClick($event)"
(taskCreated)="onTaskCreated($event)"
(assignTask)="onAssignTask()"
(taskDeleted)="onTaskDeleted()">
</adf-task-details>
<mat-divider></mat-divider>
<div *ngIf="currentTaskId">
Task Audit log
<button
adf-task-audit
[task-id]="currentTaskId"
[download]="true"
mat-icon-button (clicked)="onAuditClick($event)" (error)="onAuditError($event)">
<mat-icon>assignment_ind</mat-icon>
</button>
<mat-divider></mat-divider>
</div>
<mat-card>
<mat-card-content>
<app-task-attachments [taskId]="currentTaskId"></app-task-attachments>
</mat-card-content>
</mat-card>
</div>
<div
class="app-grid-item app-tasks-start"
*ngIf="isStartTaskMode()">
<adf-start-task
[appId]="appId"
[name]="defaultTaskName"
(success)="onStartTaskSuccess($event)"
(cancel)="onCancelStartTask()">
</adf-start-task>
</div>
</div>
</div>
</mat-tab>
<mat-tab id="processes-header" href="#processes" label="Process">
<div class="app-page-content" *ngIf="showProcessTab">
<div class="app-grid">
<div
id="app-processes-menu"
class="app-grid-item app-processes-menu">
<div class="app-list-buttons">
<adf-sidebar-action-menu [expanded]="true" [width]="205" title="CREATE">
<mat-icon sidebar-menu-title-icon>arrow_drop_down</mat-icon>
<div adf-sidebar-menu-options>
<button mat-menu-item data-automation-id="btn-start-process" (click)="navigateStartProcess()">
<mat-icon>assessment</mat-icon>
<span>New Process</span>
</button>
</div>
</adf-sidebar-action-menu>
</div>
<mat-accordion class="app-accordion-panel" displayMode="flat">
<mat-expansion-panel class="mat-elevation-z0" [expanded]="true">
<mat-expansion-panel-header>
<mat-panel-title>
<mat-icon>assessment</mat-icon>
<div id="process-accordion-title" class="app-accordion-title-padding">Processes</div>
</mat-panel-title>
</mat-expansion-panel-header>
<adf-process-instance-filters
#activitiProcessFilter
role="group"
aria-labelledby="process-accordion-title"
[appId]="appId"
[filterParam]="filterSelected"
[showIcon]="showProcessFilterIcon"
(filterClicked)="onProcessFilterChange($event)"
(filterSelected)="onProcessFilterChange($event)"
(success)="onSuccessProcessFilterList()">
</adf-process-instance-filters>
</mat-expansion-panel>
</mat-accordion>
</div>
<div
class="app-grid-item app-processes-list app-list"
*ngIf="processFilter && !isStartProcessMode()">
<adf-process-instance-list
#processList
*ngIf="processFilter?.filter" [appId]="processFilter?.appId"
[selectionMode]="selectionMode"
[presetColumn]="presetColumn"
[state]="processFilter?.filter?.state"
[page]="processPage"
[size]="paginationPageSize"
[sort]="processFilter?.filter?.sort"
[showContextMenu]="processContextMenu"
(showRowContextMenu)="onShowProcessRowContextMenu($event)"
(rowClick)="onProcessRowClick($event)"
(row-dblclick)="onProcessRowDblClick($any($event))"
[multiselect]="multiSelectProcess"
(success)="onSuccessProcessList()">
</adf-process-instance-list>
<adf-pagination
*ngIf="processList"
[target]="processList"
(changePageSize)="onChangePageSize($event)"
#processListPagination>
</adf-pagination>
</div>
<div
class="app-grid-item app-processes-details"
*ngIf="!isStartProcessMode()">
<adf-process-instance-details
#activitiProcessDetails
[processInstanceId]="currentProcessInstanceId"
(processCancelled)="processCancelled()"
(showProcessDiagram)="onShowProcessDiagram($event)"
(taskClick)="onProcessDetailsTaskClick($event)">
</adf-process-instance-details>
<mat-divider></mat-divider>
<div *ngIf="currentProcessInstanceId">
Process Audit log
<button adf-process-audit
[process-id]="currentProcessInstanceId"
[download]="true" mat-icon-button
[format]="'pdf'"
(clicked)="onAuditClick($event)"
(error)="onAuditError($event)">
<mat-icon>assignment_ind</mat-icon>
</button>
<mat-divider></mat-divider>
</div>
<mat-card>
<mat-card-content>
<app-process-attachments [processInstanceId]="currentProcessInstanceId">
</app-process-attachments>
</mat-card-content>
</mat-card>
</div>
<div
class="app-grid-item app-processes-start"
*ngIf="isStartProcessMode()">
<adf-start-process
#activitiStartProcess
[appId]="applicationId"
[processDefinitionName]="processDefinitionName"
[showSelectApplicationDropdown]="showApplications"
[title]="'Start Process'"
[name]="defaultProcessName"
(formContentClicked)="onContentClick($event)"
(start)="onStartProcessInstance($event)"
(cancel)="onCancelProcessInstance()"
(error)="onStartProcessError($event)">
</adf-start-process>
</div>
</div>
</div>
</mat-tab>
<mat-tab id="settings-header" href="#settings" label="Settings">
data-automation-id="navigation-bar" [animationDuration]="'0'">
<mat-tab id="app-tasks-header" label="Tasks">
<div class="app-grid">
<div class="app-grid-item app-settings-menu">
<span><h3>Settings Menu</h3></span>
<div class="app-grid-item app-tasks-menu">
<adf-sidebar-action-menu [expanded]="true" [width]="205" title="CREATE">
<mat-icon sidebar-menu-title-icon>arrow_drop_down</mat-icon>
<div adf-sidebar-menu-options>
<button mat-menu-item data-automation-id="btn-start-task" (click)="navigateStartTask()">
<mat-icon>assessment</mat-icon>
<span>New Task</span>
</button>
</div>
</adf-sidebar-action-menu>
<adf-task-filters [filterParam]="filterSelected"
role="group"
[appId]="appId"
(filterClicked)="onTaskFilterClick($event)"
(filterSelected)="onTaskFilterClick($event)"
(success)="onSuccessTaskFilterList()" #activitiFilter>
</adf-task-filters>
</div>
<div class="app-grid-item app-settings-details">
<div>
<mat-slide-toggle id="adf-show-task-filter-icon" [(ngModel)]="showTaskFilterIcon">Show task filters icons
</mat-slide-toggle>
<div
class="app-grid-item app-tasks-list"
*ngIf="taskFilter && !isStartTaskMode()">
<adf-tasklist
[appId]="taskFilter?.appId"
[presetColumn]="presetColumn"
[page]="taskPage"
[size]="paginationPageSize"
[name]="taskFilter?.filter?.name"
[assignment]="taskFilter?.filter?.assignment"
[state]="taskFilter?.filter?.state"
[sort]="taskFilter?.filter?.sort"
[landingTaskId]="currentTaskId"
(rowClick)="onTaskRowClick($event)"
(success)="onSuccessTaskList()"
(row-dblclick)="onTaskRowDblClick($any($event))"
#taskList>
</adf-tasklist>
<adf-pagination
*ngIf="taskList"
[target]="taskList"
(changePageSize)="onChangePageSize($event)"
#taskListPagination>
</adf-pagination>
</div>
<div
class="app-grid-item app-tasks-details"
*ngIf="!isStartTaskMode()"
data-automation-id="app-tasks-details">
<adf-task-details #activitiDetails
[debugMode]="true"
[taskId]="currentTaskId"
[showFormTitle]="true"
[fieldValidators]="fieldValidators"
[showHeaderContent]="true"
(formCompleted)="onFormCompleted()"
(formContentClicked)="onContentClick($event)"
(taskCreated)="onTaskCreated($event)"
(assignTask)="onAssignTask()"
(taskDeleted)="onTaskDeleted()">
</adf-task-details>
<div *ngIf="currentTaskId">
Task Audit log
<button
adf-task-audit
[task-id]="currentTaskId"
[download]="true"
mat-icon-button>
<mat-icon>download</mat-icon>
</button>
</div>
<div>
<mat-slide-toggle id="adf-show-process-filter-icon" [(ngModel)]="showProcessFilterIcon">Show process filters icons
</mat-slide-toggle>
<app-task-attachments [taskId]="currentTaskId"></app-task-attachments>
</div>
<div class="app-grid-item app-tasks-start" *ngIf="isStartTaskMode()">
<adf-start-task
[appId]="appId"
[name]="defaultTaskName"
(success)="onStartTaskSuccess($event)"
(cancel)="onCancelStartTask()">
</adf-start-task>
</div>
</div>
</mat-tab>
<mat-tab id="processes-header" label="Process">
<div class="app-grid">
<div id="app-processes-menu" class="app-grid-item app-processes-menu">
<adf-sidebar-action-menu [expanded]="true" [width]="205" title="CREATE">
<mat-icon sidebar-menu-title-icon>arrow_drop_down</mat-icon>
<div adf-sidebar-menu-options>
<button mat-menu-item data-automation-id="btn-start-process" (click)="navigateStartProcess()">
<mat-icon>assessment</mat-icon>
<span>New Process</span>
</button>
</div>
</adf-sidebar-action-menu>
<adf-process-instance-filters
#activitiProcessFilter
[appId]="appId"
[filterParam]="filterSelected"
[showIcon]="false"
(filterClicked)="onProcessFilterChange($event)"
(filterSelected)="onProcessFilterChange($event)"
(success)="onSuccessProcessFilterList()">
</adf-process-instance-filters>
</div>
<div
class="app-grid-item app-processes-list"
*ngIf="processFilter && !isStartProcessMode()">
<adf-process-instance-list
#processList
*ngIf="processFilter?.filter" [appId]="processFilter?.appId"
[presetColumn]="presetColumn"
[state]="processFilter?.filter?.state"
[page]="processPage"
[size]="paginationPageSize"
[sort]="processFilter?.filter?.sort"
(rowClick)="onProcessRowClick($event)"
(row-dblclick)="onProcessRowDblClick($any($event))"
(success)="onSuccessProcessList()">
</adf-process-instance-list>
<adf-pagination
*ngIf="processList"
[target]="processList"
(changePageSize)="onChangePageSize($event)"
#processListPagination>
</adf-pagination>
</div>
<div class="app-grid-item app-processes-details" *ngIf="!isStartProcessMode()">
<adf-process-instance-details
#activitiProcessDetails
[processInstanceId]="currentProcessInstanceId"
(processCancelled)="processCancelled()"
(showProcessDiagram)="onShowProcessDiagram($event)"
(taskClick)="onProcessDetailsTaskClick($event)">
</adf-process-instance-details>
<div *ngIf="currentProcessInstanceId">
Process Audit log
<button adf-process-audit
[process-id]="currentProcessInstanceId"
[download]="true" mat-icon-button
[format]="'pdf'">
<mat-icon>download</mat-icon>
</button>
</div>
<div>
<mat-slide-toggle id="adf-show-header" (change)="toggleHeaderContent()" [checked]="showHeaderContent">Show details header
</mat-slide-toggle>
</div>
<div>
<mat-slide-toggle id="adf-process-multiselect" [(ngModel)]="multiSelectProcess">Multiselect Process List
</mat-slide-toggle>
</div>
<div>
<mat-slide-toggle id="adf-task-multiselect" [(ngModel)]="multiSelectTask">Multiselect Task List
</mat-slide-toggle>
</div>
<div>
<mat-slide-toggle id="adf-task-context-menu" [(ngModel)]="taskContextMenu">Show Task list Context menu</mat-slide-toggle>
</div>
<div>
<mat-slide-toggle id="adf-process-context-menu" [(ngModel)]="processContextMenu">Show Process list Context menu</mat-slide-toggle>
</div>
<div>
<mat-slide-toggle id="adf-start-process-app-drop-down" [(ngModel)]="showApplications">Show Application dropdown on start process</mat-slide-toggle>
<mat-card class="example-card" *ngIf="showApplications">
<mat-card-header >
<mat-card-title>Filter Process definitions</mat-card-title>
</mat-card-header>
<mat-card-content class="app-filter-process-definitions-inputs">
<mat-form-field>
<mat-label>ApplicationId</mat-label>
<input matInput [(ngModel)]="applicationId">
</mat-form-field>
<mat-form-field>
<mat-label>ProcessDefinitionName</mat-label>
<input matInput [(ngModel)]="processDefinitionName">
</mat-form-field>
</mat-card-content>
</mat-card>
</div>
<br>
<mat-radio-group [(ngModel)]="selectionMode">
<mat-radio-button value="multiple">multiple</mat-radio-button>
<mat-radio-button value="single">single</mat-radio-button>
<mat-radio-button value="none">none</mat-radio-button>
</mat-radio-group>
<app-process-attachments [processInstanceId]="currentProcessInstanceId">
</app-process-attachments>
</div>
<div
class="app-grid-item app-processes-start"
*ngIf="isStartProcessMode()">
<adf-start-process
#activitiStartProcess
[appId]="applicationId"
[processDefinitionName]="processDefinitionName"
[title]="'Start Process'"
[name]="defaultProcessName"
(formContentClicked)="onContentClick($event)"
(start)="onStartProcessInstance($event)"
(cancel)="onCancelProcessInstance()"
(error)="onStartProcessError($event)">
</adf-start-process>
</div>
</div>
</mat-tab>

View File

@ -1,88 +1,16 @@
.app-no-form-container {
text-align: center;
font-weight: 600;
font-size: 18px;
}
.app-grid {
flex-direction: row;
display: flex;
max-height: 100%;
place-content: stretch flex-start;
align-items: stretch;
background-color: white;
.app-grid-item {
flex: 1;
margin: 4px;
box-shadow:
0 2px 2px 0 rgba(0, 0, 0, 0.14),
0 3px 1px -2px rgba(0, 0, 0, 0.2),
0 1px 5px 0 rgba(0, 0, 0, 0.12);
border: 1px solid rgba(0, 0, 0, 0.14);
padding: 10px;
.app-filter-process-definitions-inputs {
flex-direction: column;
display: flex;
max-width: 100%;
place-content: stretch space-around;
align-items: stretch;
}
}
.app-list-buttons {
margin-bottom: 24px;
}
.app-tasks-list.app-small-pagination,
.app-processes-list.app-small-pagination {
.app-pagination {
flex-wrap: wrap;
padding-bottom: 24px;
padding-top: 8px;
&__range-block.app-pagination__block:first-child {
order: 1;
width: 60%;
flex: 0 0 auto;
box-sizing: border-box;
padding-left: 2px;
justify-content: flex-start;
}
&__perpage-block {
order: 3;
width: 60%;
box-sizing: border-box;
padding-left: 2px;
justify-content: flex-start;
}
&__actualinfo-block {
order: 2;
width: 40%;
box-sizing: border-box;
padding-right: 2px;
justify-content: flex-end;
}
&__controls-block {
order: 4;
width: 40%;
box-sizing: border-box;
padding-right: 2px;
justify-content: flex-end;
}
}
}
.app-list {
.app-datatable-list {
border: none;
}
}
mat-slide-toggle {
margin: 10px;
}
@media screen and (min-width: 1280px) {
@ -104,13 +32,7 @@
min-width: 225px;
}
.app-settings-menu {
flex: 1 1 300px;
max-width: 300px;
min-width: 300px;
}
.app-tasks-details, .app-tasks-start, .app-processes-details, .app-processes-start, .app-settings-details {
.app-tasks-details, .app-tasks-start, .app-processes-details, .app-processes-start {
flex: 1 1 auto;
min-width: auto;
}
@ -130,24 +52,3 @@
max-height: initial;
}
}
.app-accordion-panel {
.mat-expansion-panel {
background: inherit;
}
.mat-expansion-panel-header-title,
.mat-expansion-panel-header-description {
flex-basis: 0;
align-items: center;
}
.mat-expansion-panel-header-description {
justify-content: space-between;
align-items: center;
}
.app-accordion-title-padding {
padding-left: 20px;
}
}

View File

@ -29,14 +29,10 @@ import {
Output
} from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import {
Pagination,
UserProcessInstanceFilterRepresentation,
ScriptFilesApi
} from '@alfresco/js-api';
import { Pagination, UserProcessInstanceFilterRepresentation, ScriptFilesApi } from '@alfresco/js-api';
import {
FORM_FIELD_VALIDATORS, FormRenderingService, FormService, AppConfigService, PaginationComponent, UserPreferenceValues,
AlfrescoApiService, UserPreferencesService, LogService, DataCellEvent, NotificationService
AlfrescoApiService, UserPreferencesService, NotificationService
} from '@alfresco/adf-core';
import {
ProcessFiltersComponent,
@ -114,24 +110,15 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
@Output()
changePageSize = new EventEmitter<Pagination>();
multiSelectTask = false;
multiSelectProcess = false;
selectionMode = 'single';
taskContextMenu = false;
processContextMenu = false;
private tabs = { tasks: 0, processes: 1, reports: 2 };
layoutType: string;
currentTaskId: string;
currentProcessInstanceId: string;
taskSchemaColumns: any[] = [];
taskPage = 0;
processPage = 0;
paginationPageSize = 0;
processSchemaColumns: any[] = [];
showHeaderContent = true;
defaultProcessDefinitionName: string;
defaultProcessName: string;
@ -146,11 +133,6 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
presetColumn = 'default';
showTaskTab: boolean;
showProcessTab: boolean;
showProcessFilterIcon: boolean;
showTaskFilterIcon: boolean;
showApplications: boolean;
applicationId: number;
processDefinitionName: string;
@ -167,7 +149,6 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
private route: ActivatedRoute,
private router: Router,
private apiService: AlfrescoApiService,
private logService: LogService,
private appConfig: AppConfigService,
private preview: PreviewService,
formRenderingService: FormRenderingService,
@ -187,18 +168,6 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
// Uncomment this line to map 'custom_stencil_01' to local editor component
formRenderingService.setComponentTypeResolver('custom_stencil_01', () => CustomStencil01, true);
formService.formLoaded
.pipe(takeUntil(this.onDestroy$))
.subscribe(formEvent => {
this.logService.log(`Form loaded: ${formEvent.form.id}`);
});
formService.formFieldValueChanged
.pipe(takeUntil(this.onDestroy$))
.subscribe(formFieldEvent => {
this.logService.log(`Field value changed. Form: ${formFieldEvent.form.id}, Field: ${formFieldEvent.field.id}, Value: ${formFieldEvent.field.value}`);
});
this.preferenceService
.select(UserPreferenceValues.PaginationSize)
.pipe(takeUntil(this.onDestroy$))
@ -224,30 +193,12 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
.subscribe((content) => {
this.showContentPreview(content);
});
formService.validateForm
.pipe(takeUntil(this.onDestroy$))
.subscribe(validateFormEvent => {
this.logService.log('Error form:' + validateFormEvent.errorsField);
});
// Uncomment this block to see form event handling in action
/*
formService.formEvents
.pipe(takeUntil(this.onDestroy$))
.subscribe((event: Event) => {
this.logService.log('Event fired:' + event.type);
this.logService.log('Event Target:' + event.target);
});
*/
}
ngOnInit() {
if (this.router.url.includes('processes')) {
this.activeTab = this.tabs.processes;
}
this.showProcessTab = this.activeTab === this.tabs.processes;
this.showTaskTab = this.activeTab === this.tabs.tasks;
this.route.params.subscribe((params) => {
const applicationId = params['appId'];
@ -273,24 +224,14 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
onTaskFilterClick(filter: FilterRepresentationModel): void {
this.applyTaskFilter(filter);
this.resetTaskPaginationPage();
}
resetTaskPaginationPage() {
this.taskPage = 0;
}
toggleHeaderContent(): void {
this.showHeaderContent = !this.showHeaderContent;
}
onTabChange(event: any): void {
const index = event.index;
if (index === TASK_ROUTE) {
this.showTaskTab = event.index === this.tabs.tasks;
this.relocateLocationToTask();
} else if (index === PROCESS_ROUTE) {
this.showProcessTab = event.index === this.tabs.processes;
this.relocateLocationToProcess();
if (this.processList) {
this.processList.reload();
@ -445,14 +386,6 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
}
}
onAuditClick(event: any) {
this.logService.log(event);
}
onAuditError(event: any): void {
this.logService.error('My custom error message' + event);
}
onTaskCreated(data: any): void {
this.currentTaskId = data.parentTaskId;
this.taskList.reload();
@ -466,7 +399,7 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
this.loadStencilScriptsInPageFromProcessService();
}
loadStencilScriptsInPageFromProcessService() {
private loadStencilScriptsInPageFromProcessService() {
this.scriptFileApi.getControllers().then((response) => {
if (response) {
const stencilScript = document.createElement('script');
@ -507,46 +440,8 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
this.activitiFilter.selectFilter(this.activitiFilter.getCurrentFilter());
}
onRowClick(event): void {
this.logService.log(event);
}
onRowDblClick(event): void {
this.logService.log(event);
}
onAssignTask() {
this.taskList.reload();
this.currentTaskId = null;
}
onShowTaskRowContextMenu(event: DataCellEvent) {
event.value.actions = [
{
data: event.value.row['obj'],
model: {
key: 'taskDetails',
icon: 'open',
title: 'Task List Context Menu',
visible: true
},
subject: new Subject()
}
];
}
onShowProcessRowContextMenu(event: DataCellEvent) {
event.value.actions = [
{
data: event.value.row['obj'],
model: {
key: 'processDetails',
icon: 'open',
title: 'Process List Context Menu',
visible: true
},
subject: new Subject()
}
];
}
}

View File

@ -1,4 +1,6 @@
<div>
<button mat-mini-fab (click)="onClickBack()" ><mat-icon>keyboard_backspace</mat-icon></button>
<button id="btn-diagram-back" mat-icon-button (click)="onClickBack()">
<mat-icon>keyboard_backspace</mat-icon>
</button>
<adf-diagram [processInstanceId]="processDefinitionId"></adf-diagram>
</div>

View File

@ -20,8 +20,7 @@ import { ActivatedRoute, Router, Params } from '@angular/router';
@Component({
selector: 'app-show-diagram',
templateUrl: './show-diagram.component.html',
styleUrls: ['./show-diagram.component.css']
templateUrl: './show-diagram.component.html'
})
export class ShowDiagramComponent {

View File

@ -1,7 +0,0 @@
<ng-container *ngIf="sharedLinkId">
<adf-alfresco-viewer
(invalidSharedLink)="redirectTo404()"
[sharedLinkId]="sharedLinkId"
[allowGoBack]="false">
</adf-alfresco-viewer>
</ng-container>

View File

@ -1,4 +0,0 @@
.app-shared-link-view {
width: 100%;
height: 100%;
}

View File

@ -1,45 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, ViewEncapsulation, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
@Component({
selector: 'app-shared-link-view',
templateUrl: './shared-link-view.component.html',
styleUrls: [ './shared-link-view.component.scss' ],
encapsulation: ViewEncapsulation.None,
// eslint-disable-next-line
host: { 'class': 'app-shared-link-view' }
})
export class SharedLinkViewComponent implements OnInit {
sharedLinkId: string = null;
constructor(private route: ActivatedRoute, private router: Router) {}
ngOnInit() {
this.route.params.subscribe((params) => {
this.sharedLinkId = params.id;
});
}
redirectTo404() {
this.router.navigate(['error/404']);
}
}

View File

@ -1,95 +0,0 @@
<div class="inner-layout">
<div class="inner-layout__header">
<adf-breadcrumb [root]="'Trashcan'"></adf-breadcrumb>
<adf-toolbar class="adf-toolbar--inline">
<button
mat-icon-button
[adf-delete]="documentList.selection"
(delete)="documentList.reload()"
[permanent]="true"
*ngIf="documentList.selection.length"
title="Delete permanently">
<mat-icon>delete_forever</mat-icon>
</button>
<button
mat-icon-button
(selection-node-restored)="refresh()"
(restore)="onRestore($event)"
[adf-restore]="$any(documentList).selection"
*ngIf="documentList.selection.length"
title="Restore">
<mat-icon>restore</mat-icon>
</button>
</adf-toolbar>
</div>
<div class="inner-layout__content">
<adf-document-list #documentList
currentFolderId="-trashcan-"
selectionMode="multiple"
[multiselect]="true"
[navigate]="false"
locationFormat="/files"
[sorting]="[ 'archivedAt', 'desc' ]"
[contextMenuActions]="true"
[contentActions]="false">
<adf-custom-empty-content-template>
<adf-empty-content
icon="delete"
[title]="'Trash is empty'">
<div class="adf-empty-content__text">Items you delete are moved to the Trash.</div>
<div class="adf-empty-content__text">Empty Trash to permanently delete items.</div>
</adf-empty-content>
</adf-custom-empty-content-template>
<data-columns>
<data-column
key="$thumbnail"
type="image"
[sortable]="false"
class="adf-image-table-cell">
</data-column>
<data-column
class="adf-datatable-cell--ellipsis__name"
key="name"
title="Display name">
<ng-template let-value="value" let-context>
<span title="{{ context?.row?.obj | adfNodeNameTooltip }}"
class="adf-datatable-cell-value">{{ value }}</span>
</ng-template>
</data-column>
<data-column
key="content.sizeInBytes"
title="Size"
type="fileSize">
</data-column>
<data-column
key="archivedAt"
title="Deleted on">
<ng-template let-value="value">
<span title="{{ value | adfLocalizedDate: 'medium' }}"
class="adf-datatable-cell-value">{{ value | adfTimeAgo: currentLocale }}</span>
</ng-template>
</data-column>
<data-column
class="adf-datatable-cell--ellipsis"
key="archivedByUser.displayName"
title="Deleted by">
</data-column>
</data-columns>
</adf-document-list>
<adf-pagination [ngClass]="{ 'no-border' : documentList.isEmpty()}" [target]="documentList">
</adf-pagination>
</div>
</div>

View File

@ -1,75 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, ViewChild, OnInit, OnDestroy } from '@angular/core';
import { DocumentListComponent, RestoreMessageModel } from '@alfresco/adf-content-services';
import { UserPreferencesService, UserPreferenceValues, NotificationService } from '@alfresco/adf-core';
import { Router } from '@angular/router';
import { PathInfoEntity } from '@alfresco/js-api';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@Component({
templateUrl: './trashcan.component.html'
})
export class TrashcanComponent implements OnInit, OnDestroy {
@ViewChild('documentList', { static: true })
documentList: DocumentListComponent;
currentLocale;
private onDestroy$ = new Subject<boolean>();
constructor(
private preference: UserPreferencesService,
private router: Router,
private notificationService: NotificationService) {
}
ngOnInit() {
this.preference
.select(UserPreferenceValues.Locale)
.pipe(takeUntil(this.onDestroy$))
.subscribe(locale => this.currentLocale = locale);
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
onRestore(restoreMessage: RestoreMessageModel) {
this.notificationService
.openSnackMessageAction(
restoreMessage.message,
restoreMessage.action
)
.onAction()
.subscribe(() => this.navigateLocation(restoreMessage.path));
this.documentList.reload();
}
private navigateLocation(path: PathInfoEntity) {
const parent = path.elements[path.elements.length - 1];
this.router.navigate(['files/', parent.id]);
}
refresh() {
this.documentList.reload();
this.documentList.resetSelection();
}
}

View File

@ -1,41 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { NgModule } from '@angular/core';
import { TrashcanComponent } from './trashcan.component';
import { Routes, RouterModule } from '@angular/router';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { ContentModule } from '@alfresco/adf-content-services';
const routes: Routes = [
{
path: '',
component: TrashcanComponent
}
];
@NgModule({
imports: [
CommonModule,
RouterModule.forChild(routes),
CoreModule,
ContentModule.forChild()
],
declarations: [TrashcanComponent]
})
export class AppTrashcanModule {}

View File

@ -1,22 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { AppNotificationsService } from './app-notifications.service';
export function setupAppNotifications(appNotificationsService: AppNotificationsService) {
return () => appNotificationsService;
}

View File

@ -1,134 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
AuthenticationService,
AppConfigService,
NotificationService,
NotificationModel,
AlfrescoApiService,
IdentityUserService
} from '@alfresco/adf-core';
import { NotificationCloudService } from '@alfresco/adf-process-services-cloud';
import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { map } from 'rxjs/operators';
const SUBSCRIPTION_QUERY = `
subscription {
engineEvents(eventType: [
PROCESS_STARTED
TASK_ASSIGNED
TASK_UPDATED,
TASK_CREATED
]) {
eventType
entity
}
}
`;
@Injectable()
export class AppNotificationsService {
constructor(
private appConfigService: AppConfigService,
private authenticationService: AuthenticationService,
private notificationCloudService: NotificationCloudService,
private notificationService: NotificationService,
private translateService: TranslateService,
private identityUserService: IdentityUserService,
private alfrescoApiService: AlfrescoApiService
) {
this.alfrescoApiService.alfrescoApiInitialized.subscribe(() => {
if (this.isProcessServicesEnabled() && this.notificationsEnabled) {
this.authenticationService.once('token_received').subscribe(() => {
const deployedApps = this.appConfigService.get('alfresco-deployed-apps', []);
if (deployedApps?.length) {
deployedApps.forEach((app) => {
this.notificationCloudService
.makeGQLQuery(app.name, SUBSCRIPTION_QUERY)
.pipe(map((events: any) => events.data.engineEvents))
.subscribe((result) => {
result.map((engineEvent) => this.notifyEvent(engineEvent));
});
});
}
});
}
});
}
private get notificationsEnabled(): boolean {
return this.appConfigService.get('notifications', true);
}
private isProcessServicesEnabled(): boolean {
return this.authenticationService.isLoggedIn() && (this.authenticationService.isBPMProvider() || this.authenticationService.isALLProvider());
}
notifyEvent(engineEvent) {
let message;
switch (engineEvent.eventType) {
case 'TASK_ASSIGNED':
message = this.translateService.instant('NOTIFICATIONS.TASK_ASSIGNED', {
taskName: engineEvent.entity.name || '',
assignee: engineEvent.entity.assignee
});
this.pushNotification(engineEvent, message);
break;
case 'TASK_UPDATED':
message = this.translateService.instant('NOTIFICATIONS.TASK_UPDATED', { taskName: engineEvent.entity.name || '' });
this.pushNotification(engineEvent, message);
break;
case 'TASK_COMPLETED':
message = this.translateService.instant('NOTIFICATIONS.TASK_COMPLETED', { taskName: engineEvent.entity.name || '' });
this.pushNotification(engineEvent, message);
break;
case 'TASK_ACTIVATED':
message = this.translateService.instant('NOTIFICATIONS.TASK_ACTIVATED', { taskName: engineEvent.entity.name || '' });
this.pushNotification(engineEvent, message);
break;
case 'TASK_CANCELLED':
message = this.translateService.instant('NOTIFICATIONS.TASK_CANCELLED', { taskName: engineEvent.entity.name || '' });
this.pushNotification(engineEvent, message);
break;
case 'TASK_SUSPENDED':
message = this.translateService.instant('NOTIFICATIONS.TASK_SUSPENDED', { taskName: engineEvent.entity.name || '' });
this.pushNotification(engineEvent, message);
break;
case 'TASK_CREATED':
message = this.translateService.instant('NOTIFICATIONS.TASK_CREATED', { taskName: engineEvent.entity.name || '' });
this.pushNotification(engineEvent, message);
break;
default:
}
}
pushNotification(engineEvent: any, message: string) {
if (engineEvent.entity.assignee === this.identityUserService.getCurrentUserInfo().username) {
const notification = {
messages: [message],
icon: 'info',
datetime: new Date(),
initiator: { displayName: engineEvent.entity.initiator || 'System' }
} as NotificationModel;
this.notificationService.pushToNotificationHistory(notification);
}
}
}

View File

@ -1,9 +1,6 @@
{
"$schema": "../../../lib/extensions/src/lib/config/schema/app-extension.schema.json",
"$references": [
"plugin1.json",
"plugin2.json"
],
"$references": [],
"$dependencies": [],
"features": {

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" clip-rule="evenodd" version="1.1" viewBox="0 0 24 24" xml:space="preserve"><g id="Artboard_1"><g id="Page_1"><rect id="Fill_1" width="24" height="24" x="0" y="0" fill="none"/><path id="Fill_2" fill-rule="nonzero" d="M20,20l-16,0c-1.097,0 -2,-0.903 -2,-2l0.01,-12c0,-1.093 0.897,-1.995 1.99,-2l6,0l2,2l8,0c1.097,0 2,0.903 2,2l0,10c0,1.097 -0.903,2 -2,2Zm-9,-9l0,4l4,0l0,2l4,-4l-4,-4l0,2l-4,0Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 588 B

View File

@ -1,14 +0,0 @@
{
"$schema": "../../../lib/extensions/config/schema/plugin-extension.schema.json",
"$name": "plugin1",
"$version": "1.0.0",
"$vendor": "Alfresco",
"$license": "Apache-2.0",
"$runtime": "2.7.0",
"$description": "example plugin",
"features": {
"custom": {
"key": "value"
}
}
}

View File

@ -1,14 +0,0 @@
{
"$schema": "../../../lib/extensions/config/schema/plugin-extension.schema.json",
"$name": "plugin2",
"$version": "1.1.0",
"$vendor": "Alfresco",
"$license": "Apache-2.0",
"$runtime": "2.7.0",
"$description": "another example plugin",
"features": {
"extra": {
"key": "value"
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -1,22 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* SystemJS module definition */
declare const module: NodeModule;
interface NodeModule {
id: string;
}

View File

@ -1,354 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createApiService,
LoginPage,
StringUtil,
UploadActions,
UserModel,
UsersActions,
WaitActions
} from '@alfresco/adf-testing';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
import { ContentServicesPage } from '../../core/pages/content-services.page';
import { LockFilePage } from '../../content-services/pages/lock-file.page';
import { FileModel } from '../../models/ACS/file.model';
import { browser } from 'protractor';
import { NodeEntry, NodesApi, SitesApi } from '@alfresco/js-api';
import CONSTANTS = require('../../util/constants');
describe('Lock File', () => {
const loginPage = new LoginPage();
const navigationBarPage = new NavigationBarPage();
const lockFilePage = new LockFilePage();
const contentServices = new ContentServicesPage();
const adminUser = new UserModel();
const managerUser = new UserModel();
const apiService = createApiService();
const usersActions = new UsersActions(apiService);
const uploadActions = new UploadActions(apiService);
const waitActions = new WaitActions(apiService);
const nodesApi = new NodesApi(apiService.getInstance());
const pngFileModel = new FileModel({
name: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_name,
location: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_path
});
const pngFileToLock = new FileModel({
name: browser.params.resources.Files.ADF_DOCUMENTS.PNG_B.file_name,
location: browser.params.resources.Files.ADF_DOCUMENTS.PNG_B.file_path
});
const pngFileToLockAdmin = new FileModel({
name: browser.params.resources.Files.ADF_DOCUMENTS.PNG_C.file_name,
location: browser.params.resources.Files.ADF_DOCUMENTS.PNG_C.file_path
});
let site; let documentLibrary;
beforeAll(async () => {
await apiService.loginWithProfile('admin');
await usersActions.createUser(adminUser);
await usersActions.createUser(managerUser);
await apiService.login(adminUser.username, adminUser.password);
const sitesApi = new SitesApi(apiService.getInstance());
site = await sitesApi.createSite({
title: StringUtil.generateRandomString(),
visibility: 'PRIVATE'
});
const resultNode = await nodesApi.listNodeChildren(site.entry.guid);
documentLibrary = resultNode.list.entries[0].entry.id;
await sitesApi.createSiteMembership(site.entry.id, {
id: managerUser.username,
role: CONSTANTS.CS_USER_ROLES.MANAGER
});
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
try {
const sitesApi = new SitesApi(apiService.getInstance());
await sitesApi.deleteSite(site.entry.id, { permanent: true });
} catch (e) {
}
});
describe('Lock file interaction with the UI', () => {
let pngLockedUploadedFile: NodeEntry;
let pngUploadedFile: NodeEntry;
beforeAll(async () => {
pngLockedUploadedFile = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary);
await loginPage.login(adminUser.username, adminUser.password);
pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
await navigationBarPage.openContentServicesFolder(documentLibrary);
await contentServices.waitForTableBody();
});
afterEach(async () => {
await apiService.login(adminUser.username, adminUser.password);
try {
await nodesApi.unlockNode(pngUploadedFile.entry.id);
await waitActions.nodeIsUnlock(pngUploadedFile.entry.id);
} catch (e) {
}
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
try {
await nodesApi.unlockNode(pngLockedUploadedFile.entry.id);
} catch (e) {
}
try {
await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id);
} catch (e) {
}
try {
await uploadActions.deleteFileOrFolder(pngLockedUploadedFile.entry.id);
} catch (e) {
}
await navigationBarPage.clickLogoutButton();
});
it('[C286604] Should be able to open Lock file option by clicking the lock image', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.cancelButton.waitVisible();
await lockFilePage.saveButton.waitVisible();
});
it('[C286625] Should be able to click Cancel to cancel lock file operation', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.cancelButton.click();
await contentServices.checkUnlockedIcon(pngFileModel.name);
});
it('[C286603] Should be able to click on Lock file checkbox and lock a file', async () => {
await contentServices.lockContent(pngFileToLock.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.saveButton.click();
await contentServices.checkLockedIcon(pngFileToLock.name);
});
it('[C286618] Should be able to uncheck Lock file checkbox and unlock a file', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.saveButton.click();
await contentServices.checkLockedIcon(pngFileModel.name);
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.saveButton.click();
await contentServices.checkUnlockedIcon(pngFileModel.name);
});
});
describe('Locked file without owner permissions', () => {
let pngUploadedFile: NodeEntry;
beforeEach(async () => {
await apiService.login(adminUser.username, adminUser.password);
pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
await loginPage.login(managerUser.username, managerUser.password);
await navigationBarPage.openContentServicesFolder(documentLibrary);
});
afterEach(async () => {
await apiService.login(adminUser.username, adminUser.password);
try {
await nodesApi.unlockNode(pngUploadedFile.entry.id);
await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id);
} catch (error) {
}
await navigationBarPage.clickLogoutButton();
});
it('[C286610] Should not be able to delete a locked file', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.saveButton.click();
try {
await nodesApi.deleteNode(pngUploadedFile.entry.id);
} catch (error) {
await expect(error.status).toEqual(409);
}
});
it('[C286611] Should not be able to rename a locked file', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.saveButton.click();
try {
await nodesApi.updateNode(pngUploadedFile.entry.id, { name: 'My new name' });
} catch (error) {
await expect(error.status).toEqual(409);
}
});
it('[C286612] Should not be able to move a locked file', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.saveButton.click();
try {
await nodesApi.moveNode(pngUploadedFile.entry.id, { targetParentId: '-my-' });
} catch (error) {
await expect(error.status).toEqual(409);
}
});
it('[C286613] Should not be able to update a new version on a locked file', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.saveButton.click();
try {
await nodesApi.updateNodeContent(pngUploadedFile.entry.id, 'NEW FILE CONTENT');
} catch (error) {
await expect(error.status).toEqual(409);
}
});
});
describe('Locked file with owner permissions', () => {
let pngFileToBeLocked: NodeEntry;
let pngUploadedFile: NodeEntry;
beforeEach(async () => {
await apiService.login(adminUser.username, adminUser.password);
pngFileToBeLocked = await uploadActions.uploadFile(pngFileToLockAdmin.location, pngFileToLockAdmin.name, documentLibrary);
pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
await loginPage.login(adminUser.username, adminUser.password);
await navigationBarPage.openContentServicesFolder(documentLibrary);
await contentServices.getDocumentList().dataTable.waitTillContentLoaded();
});
afterEach(async () => {
await apiService.login(adminUser.username, adminUser.password);
try {
await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id);
await uploadActions.deleteFileOrFolder(pngFileToBeLocked.entry.id);
} catch (e) {
}
await navigationBarPage.clickLogoutButton();
});
it('[C286615] Owner of the locked file should be able to update a new version if Allow owner to modify is checked', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.allowOwnerCheckbox.click();
await lockFilePage.saveButton.click();
try {
await apiService.login(adminUser.username, adminUser.password);
const response = await nodesApi.updateNodeContent(pngUploadedFile.entry.id, 'NEW FILE CONTENT');
await expect(response.entry.modifiedAt.getTime()).toBeGreaterThan(response.entry.createdAt.getTime());
} catch (error) {
}
});
it('[C286616] Owner of the locked file should be able to move if Allow owner to modify is checked', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.allowOwnerCheckbox.click();
await lockFilePage.saveButton.click();
try {
await apiService.login(adminUser.username, adminUser.password);
await nodesApi.moveNode(pngUploadedFile.entry.id, { targetParentId: '-my-' });
const movedFile = await nodesApi.getNode(pngUploadedFile.entry.id);
await expect(movedFile.entry.parentId).not.toEqual(documentLibrary);
} catch (error) {
}
});
it('[C286617] Owner of the locked file should be able to delete if Allow owner to modify is checked', async () => {
await contentServices.lockContent(pngFileToLockAdmin.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.allowOwnerCheckbox.click();
await lockFilePage.saveButton.click();
await contentServices.deleteContent(pngFileToBeLocked.entry.name);
await contentServices.checkContentIsNotDisplayed(pngFileToBeLocked.entry.name);
});
it('[C286614] Owner of the locked file should be able to rename if Allow owner to modify is checked', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.allowOwnerCheckbox.click();
await lockFilePage.saveButton.click();
try {
const response = await nodesApi.updateNode(pngUploadedFile.entry.id, { name: 'My new name' });
await expect(response.entry.name).toEqual('My new name');
} catch (error) {
}
});
});
});

View File

@ -22,7 +22,6 @@ import {
createApiService,
BrowserActions, Logger,
LoginPage,
NotificationHistoryPage,
PermissionActions,
SearchService,
StringUtil,
@ -37,7 +36,7 @@ import { FolderModel } from '../../models/ACS/folder.model';
import { MetadataViewPage } from '../../core/pages/metadata-view.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
import { UploadDialogPage } from '../../core/pages/dialog/upload-dialog.page';
import { GroupsApi } from '@alfresco/js-api';
import { GroupsApi, NodeEntry } from '@alfresco/js-api';
describe('Permissions Component', () => {
@ -56,7 +55,6 @@ describe('Permissions Component', () => {
const contentList = contentServicesPage.getDocumentList();
const viewerPage = new ViewerPage();
const metadataViewPage = new MetadataViewPage();
const notificationHistoryPage = new NotificationHistoryPage();
const uploadDialog = new UploadDialogPage();
let file;
const fileModel = new FileModel({
@ -89,11 +87,11 @@ describe('Permissions Component', () => {
const roleContributorFolderModel = new FolderModel({ name: 'roleContributor' + StringUtil.generateRandomString() });
const roleEditorFolderModel = new FolderModel({ name: 'roleEditor' + StringUtil.generateRandomString() });
let roleConsumerFolder;
let roleCoordinatorFolder;
let roleContributorFolder;
let roleCollaboratorFolder;
let roleEditorFolder;
let roleConsumerFolder: NodeEntry;
let roleCoordinatorFolder: NodeEntry;
let roleContributorFolder: NodeEntry;
let roleCollaboratorFolder: NodeEntry;
let roleEditorFolder: NodeEntry;
beforeAll(async () => {
try {
@ -305,11 +303,9 @@ describe('Permissions Component', () => {
await contentList.checkActionMenuIsNotDisplayed();
await contentServicesPage.metadataContent('RoleConsumer' + fileModel.name);
await expect(await snackbarPage.getSnackBarMessage()).toEqual('You don\'t have access to do this.');
await notificationHistoryPage.checkNotifyContains('You don\'t have access to do this.');
await browser.sleep(3000);
await contentServicesPage.uploadFile(fileLocation);
await expect(await snackbarPage.getSnackBarMessage()).toEqual('You don\'t have the create permission to upload the content');
await notificationHistoryPage.checkNotifyContains('You don\'t have the create permission to upload the content');
});
it('[C276996] Role Contributor', async () => {
@ -324,7 +320,6 @@ describe('Permissions Component', () => {
await BrowserActions.closeMenuAndDialogs();
await contentList.checkActionMenuIsNotDisplayed();
await contentServicesPage.metadataContent('RoleContributor' + fileModel.name);
await notificationHistoryPage.checkNotifyContains('You don\'t have access to do this.');
await contentServicesPage.uploadFile(testFileModel.location);
await contentServicesPage.checkContentIsDisplayed(testFileModel.name);
await uploadDialog.fileIsUploaded(testFileModel.name);
@ -351,7 +346,6 @@ describe('Permissions Component', () => {
await expect(await metadataViewPage.getPropertyText('properties.cm:title')).toEqual('newTitle1');
await metadataViewPage.clickCloseButton();
await contentServicesPage.uploadFile(fileLocation);
await notificationHistoryPage.checkNotifyContains('You don\'t have the create permission to upload the content');
});
it('[C277003] Role Collaborator', async () => {

View File

@ -1,221 +0,0 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createApiService,
ApiUtil,
BrowserActions,
LocalStorageUtil,
LoginPage,
NotificationHistoryPage,
UploadActions,
UserModel,
UsersActions,
ViewerPage
} from '@alfresco/adf-testing';
import { ContentServicesPage } from '../../core/pages/content-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
import { ShareDialogPage } from '../../core/pages/dialog/share-dialog.page';
import { FileModel } from '../../models/ACS/file.model';
import { browser } from 'protractor';
import { SharedLinkEntry, SharedLinkPaging, SharedlinksApi } from '@alfresco/js-api';
import { CustomSourcesPage } from '../../core/pages/custom-sources.page';
describe('Share file', () => {
const loginPage = new LoginPage();
const contentServicesPage = new ContentServicesPage();
const contentListPage = contentServicesPage.getDocumentList();
const shareDialog = new ShareDialogPage();
const navigationBarPage = new NavigationBarPage();
const customSourcesPage = new CustomSourcesPage();
const viewerPage = new ViewerPage();
const notificationHistoryPage = new NotificationHistoryPage();
let acsUser: UserModel;
const apiService = createApiService();
const usersActions = new UsersActions(apiService);
const uploadActions = new UploadActions(apiService);
const sharedLinksApi = new SharedlinksApi(apiService.getInstance());
const pngFileModel = new FileModel({
name: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_name,
location: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_path
});
let nodeId;
const waitForShareLink = async (nodeIdSharedFile: string) => {
const predicate = (sharedLinkPaging: SharedLinkPaging) => {
const sharedLink = sharedLinkPaging.list.entries.find((sharedLinkEntry: SharedLinkEntry) => sharedLinkEntry.entry.nodeId === nodeIdSharedFile);
return !!sharedLink;
};
const apiCall = async () => {
await apiService.login(acsUser.username, acsUser.password);
return sharedLinksApi.listSharedLinks();
};
return ApiUtil.waitForApi(apiCall, predicate, 10, 2000);
};
beforeAll(async () => {
await apiService.loginWithProfile('admin');
acsUser = await usersActions.createUser();
await apiService.login(acsUser.username, acsUser.password);
const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, '-my-');
nodeId = pngUploadedFile.entry.id;
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await uploadActions.deleteFileOrFolder(nodeId);
});
describe('Shared link dialog', () => {
beforeAll(async () => {
await loginPage.login(acsUser.username, acsUser.password);
await navigationBarPage.navigateToContentServices();
await contentListPage.selectRow(pngFileModel.name);
await BrowserActions.closeMenuAndDialogs();
});
afterAll(async () => {
await navigationBarPage.clickLogoutButton();
});
it('[C286549] Should check automatically toggle button in Share dialog', async () => {
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.shareToggleButtonIsChecked();
await BrowserActions.closeMenuAndDialogs();
});
it('[C286544] Should display notification when clicking URL copy button', async () => {
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickShareLinkButton();
await BrowserActions.closeMenuAndDialogs();
await notificationHistoryPage.checkNotifyContains('Link copied to the clipboard');
});
it('[C286543] Should be possible to close Share dialog', async () => {
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.checkShareLinkIsDisplayed();
await BrowserActions.closeMenuAndDialogs();
});
it('[C286578] Should disable today option in expiration day calendar', async () => {
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickExpireToggle();
await shareDialog.clickDateTimePickerButton();
await shareDialog.calendarTodayDayIsDisabled();
await BrowserActions.closeMenuAndDialogs();
});
it('[C310329] Should be possible to set expiry date only for link', async () => {
await LocalStorageUtil.setConfigField('sharedLinkDateTimePickerType', JSON.stringify('date'));
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickExpireToggle();
await shareDialog.setDefaultDay();
await shareDialog.dateTimePickerDialogIsClosed();
const value = await shareDialog.getExpirationDate();
await shareDialog.clickCloseButton();
await shareDialog.dialogIsClosed();
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.expirationDateInputHasValue(value);
await BrowserActions.closeMenuAndDialogs();
});
});
describe('Shared link preview', () => {
beforeEach(async () => {
await loginPage.login(acsUser.username, acsUser.password);
await navigationBarPage.navigateToContentServices();
await contentServicesPage.waitForTableBody();
});
afterEach(async () => {
await BrowserActions.getUrl('/');
await navigationBarPage.clickLogoutButton();
});
it('[C286565] Should open file when logged user access shared link', async () => {
await contentListPage.selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickShareLinkButton();
const sharedLink = await shareDialog.getShareLink();
await BrowserActions.closeMenuAndDialogs();
await BrowserActions.getUrl(sharedLink);
await viewerPage.checkFileNameIsDisplayed(pngFileModel.name);
});
it('[C287803] Should the URL be kept the same when opening the share dialog multiple times', async () => {
await contentListPage.selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickShareLinkButton();
const sharedLink = await shareDialog.getShareLink();
await shareDialog.clickCloseButton();
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickShareLinkButton();
const secondSharedLink = await shareDialog.getShareLink();
await BrowserActions.closeMenuAndDialogs();
await expect(sharedLink).toEqual(secondSharedLink);
await BrowserActions.getUrl(sharedLink);
await viewerPage.checkFileNameIsDisplayed(pngFileModel.name);
});
it('[C286539] Should open file when non-logged user access shared link', async () => {
await contentListPage.selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.checkShareLinkIsDisplayed();
const sharedLink = await shareDialog.getShareLink();
await shareDialog.clickCloseButton();
await navigationBarPage.clickLogoutButton();
await BrowserActions.getUrl(sharedLink);
await viewerPage.checkFileNameIsDisplayed(pngFileModel.name);
});
it('[C260153] Should shared files listed in share files custom resources', async () => {
await contentListPage.selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickShareLinkButton();
await BrowserActions.closeMenuAndDialogs();
await waitForShareLink(nodeId);
await customSourcesPage.navigateToCustomSources();
await customSourcesPage.selectSharedLinksSourceType();
await customSourcesPage.checkRowIsDisplayed(pngFileModel.name);
});
});
});

Some files were not shown because too many files have changed in this diff Show More