@inriver/inri 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +11 -0
  3. package/.eslintrc.js +5 -5
  4. package/azure/pipelines/single-build-release.yml +20 -0
  5. package/azure/pipelines/templates/deployFramework.yml +30 -0
  6. package/azure/pipelines/templates/publishFramwork.yml +39 -0
  7. package/componentProperties.d.ts +8 -8
  8. package/configs/base-eslint-config.js +36 -36
  9. package/configs/base-tailwind-config.js +149 -149
  10. package/i18n.ts +11 -11
  11. package/index.ts +29 -29
  12. package/package.json +7 -2
  13. package/src/components/CAutoBreadcrumbs.vue +72 -72
  14. package/src/components/CBtn.vue +98 -98
  15. package/src/components/CColorPicker.vue +55 -55
  16. package/src/components/CContextMenu.vue +29 -29
  17. package/src/components/CDatePicker.vue +51 -51
  18. package/src/components/CDeleteTileBtn.vue +52 -52
  19. package/src/components/CDialog.vue +253 -253
  20. package/src/components/CDialogCloseBtn.vue +9 -9
  21. package/src/components/CDirtyCheck.vue +68 -68
  22. package/src/components/CDrawer.vue +44 -44
  23. package/src/components/CDrawerButton.vue +91 -91
  24. package/src/components/CExpansionItem.vue +57 -57
  25. package/src/components/CExpansionItemWithCheckbox.vue +41 -41
  26. package/src/components/CFileDropzone.vue +114 -114
  27. package/src/components/CGrid.vue +101 -101
  28. package/src/components/CHeader.vue +10 -10
  29. package/src/components/CHeaderLinks.vue +61 -61
  30. package/src/components/CHeaderMenuLink.vue +51 -51
  31. package/src/components/CHeaderSearch.vue +142 -142
  32. package/src/components/CIconBtn.vue +70 -70
  33. package/src/components/CMenuItem.vue +66 -66
  34. package/src/components/CPageContainer.vue +11 -11
  35. package/src/components/CPageError.vue +24 -24
  36. package/src/components/CPageSpinner.vue +18 -18
  37. package/src/components/CSearch.vue +45 -45
  38. package/src/components/CSection.vue +29 -29
  39. package/src/components/CSectionTitle.vue +8 -8
  40. package/src/components/CSelect.vue +208 -208
  41. package/src/components/CSlideEffect.vue +62 -62
  42. package/src/components/CSpinner.vue +107 -107
  43. package/src/components/CTableActions.vue +16 -16
  44. package/src/components/CTileBtn.vue +178 -178
  45. package/src/components/CTimePicker.vue +42 -42
  46. package/src/components/CToggleGridView.vue +26 -26
  47. package/src/components/CToggleSidebarBtn.vue +19 -19
  48. package/src/components/CTooltip.vue +44 -44
  49. package/src/components/CTreeNode.vue +39 -39
  50. package/src/components/cards/CBannerCard.vue +103 -103
  51. package/src/components/cards/CSmallCard.vue +149 -149
  52. package/src/components/internal-components/ConfirmDialog.vue +78 -78
  53. package/src/composables/useDialog.ts +46 -46
  54. package/src/composables/useDirtyCheck.ts +25 -25
  55. package/src/composables/useDoubleClickListener.ts +28 -28
  56. package/src/composables/useSelectable.ts +62 -62
  57. package/src/composables/useTruncateChips.ts +46 -46
  58. package/src/i18n/de/index.ts +17 -17
  59. package/src/i18n/en/index.ts +84 -84
  60. package/src/i18n/es/index.ts +7 -7
  61. package/src/i18n/fr/index.ts +7 -7
  62. package/src/init/initInriFramework.ts +37 -37
  63. package/src/init/useInriApp.ts +55 -55
  64. package/src/layouts/CLayoutBlank.vue +7 -7
  65. package/src/layouts/CLayoutWithBackButton.vue +50 -50
  66. package/src/layouts/CLayoutWithSidebars.vue +46 -46
  67. package/src/layouts/layout-fragments/CPageAutoBreadcrumbs.vue +6 -6
  68. package/src/layouts/layout-fragments/CPageBackButton.vue +18 -18
  69. package/src/layouts/layout-fragments/CPageBlank.vue +20 -20
  70. package/src/layouts/layout-fragments/CPageFlexCol.vue +5 -5
  71. package/src/layouts/layout-fragments/CPageLeftSidebar.vue +5 -5
  72. package/src/layouts/layout-fragments/CPageMainContent.vue +5 -5
  73. package/src/layouts/layout-fragments/CPageOuterWrapper.vue +5 -5
  74. package/src/layouts/layout-fragments/CPageRightSidebar.vue +5 -5
  75. package/src/layouts/layout-fragments/CPageTitle.vue +34 -34
  76. package/src/plugins/dialog.ts +45 -45
  77. package/src/plugins/errors/ErrorFactories.ts +59 -59
  78. package/src/plugins/errors/Errors.ts +156 -156
  79. package/src/plugins/errors/Exception.ts +6 -6
  80. package/src/plugins/errors/globalErrorHandler.ts +21 -21
  81. package/src/plugins/errors/handleError.ts +34 -34
  82. package/src/plugins/errors/logger.ts +16 -16
  83. package/src/plugins/errors/vueErrorHandler.ts +26 -26
  84. package/src/plugins/globalAppConfig.ts +25 -25
  85. package/src/plugins/i18n.ts +46 -46
  86. package/src/plugins/inriIcons.ts +58 -58
  87. package/src/plugins/inriverQuasarComponentConfigurations.ts +67 -67
  88. package/src/plugins/library.ts +119 -119
  89. package/src/plugins/notify.ts +153 -153
  90. package/src/plugins/quasar-user-options.ts +19 -19
  91. package/src/plugins/validationRules.ts +292 -292
  92. package/src/shims-vue.d.ts +6 -6
  93. package/src/stores/inriStore.ts +54 -54
  94. package/src/stores/interfaceLanguageStore.ts +27 -27
  95. package/src/styles/_css-variables.scss +101 -101
  96. package/src/styles/_reset.scss +67 -67
  97. package/src/styles/_transitions.scss +9 -9
  98. package/src/styles/_utils.scss +15 -15
  99. package/src/styles/components/_breadcrumbs.scss +3 -3
  100. package/src/styles/components/_checkboxes.scss +17 -17
  101. package/src/styles/components/_chips.scss +17 -17
  102. package/src/styles/components/_forms.scss +203 -203
  103. package/src/styles/components/_menu.scss +12 -12
  104. package/src/styles/components/_notifications.scss +24 -24
  105. package/src/styles/components/_q-editor.scss +14 -14
  106. package/src/styles/components/_radio-buttons.scss +17 -17
  107. package/src/styles/components/_tables.scss +92 -92
  108. package/src/styles/components/_tooltips.scss +5 -5
  109. package/src/styles/components/_tree.scss +86 -86
  110. package/src/styles/components/_truncated-chips.scss +39 -39
  111. package/src/styles/main.scss +45 -45
  112. package/src/styles/quasar.variables.scss +50 -50
  113. package/src/styles/tailwind/index.css +2 -2
  114. package/src/typings.d.ts +70 -70
  115. package/src/utils/colorUtils.ts +73 -73
  116. package/src/utils/errorUtils.ts +37 -37
  117. package/src/utils/fileUtils.ts +57 -57
  118. package/src/utils/helpers.ts +6 -6
  119. package/src/utils/routeUtils.ts +23 -23
  120. package/tsconfig.json +34 -34
@@ -1,68 +1,68 @@
1
- <!-- eslint-disable vue/valid-template-root -->
2
- <template />
3
-
4
- <script setup lang="ts">
5
- import { watch, onUnmounted, ref } from 'vue'
6
- import { useRouter, onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
7
- import { useInriStore } from '../stores/inriStore'
8
- import dialog from '../plugins/dialog'
9
-
10
- const props = defineProps({
11
- isDirty: {
12
- type: Boolean,
13
- default: undefined,
14
- },
15
- isDialogOpen: {
16
- type: Boolean,
17
- default: false,
18
- },
19
- })
20
-
21
- const privateId = `dirty-check_${Math.random()}`
22
- const dirtyDialogIsOpen = ref(false)
23
- const willRedirect = ref(false)
24
- const router = useRouter()
25
- const inriStore = useInriStore()
26
-
27
- watch(() => props.isDirty, value => {
28
- inriStore.toggleDirtyComponent(privateId, value)
29
- }, { immediate: true })
30
-
31
- onUnmounted(() => {
32
- inriStore.toggleDirtyComponent(privateId, false)
33
- })
34
-
35
- onBeforeRouteUpdate((to) => {
36
- return handleRouteChange(to)
37
- })
38
-
39
- onBeforeRouteLeave((to) => {
40
- return handleRouteChange(to)
41
- })
42
-
43
- function handleRouteChange (to) {
44
- // If a dialog is open then just do nothing (prevent navigation)
45
- if (props.isDialogOpen) {
46
- return false
47
- }
48
-
49
- if (props.isDirty && !willRedirect.value) {
50
- if (!dirtyDialogIsOpen.value) {
51
- dirtyDialogIsOpen.value = true
52
- dialog.confirm({
53
- title: 'unsaved data',
54
- text: 'are you sure you want to leave the page without saving your data?',
55
- confirmButtonText: 'yes',
56
- }).onOk(() => {
57
- willRedirect.value = true
58
- router.push(to)
59
- }).onDismiss(() => {
60
- dirtyDialogIsOpen.value = false
61
- })
62
- return false
63
- } else {
64
- return false
65
- }
66
- }
67
- }
68
- </script>
1
+ <!-- eslint-disable vue/valid-template-root -->
2
+ <template />
3
+
4
+ <script setup lang="ts">
5
+ import { watch, onUnmounted, ref } from 'vue'
6
+ import { useRouter, onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
7
+ import { useInriStore } from '../stores/inriStore'
8
+ import dialog from '../plugins/dialog'
9
+
10
+ const props = defineProps({
11
+ isDirty: {
12
+ type: Boolean,
13
+ default: undefined,
14
+ },
15
+ isDialogOpen: {
16
+ type: Boolean,
17
+ default: false,
18
+ },
19
+ })
20
+
21
+ const privateId = `dirty-check_${Math.random()}`
22
+ const dirtyDialogIsOpen = ref(false)
23
+ const willRedirect = ref(false)
24
+ const router = useRouter()
25
+ const inriStore = useInriStore()
26
+
27
+ watch(() => props.isDirty, value => {
28
+ inriStore.toggleDirtyComponent(privateId, value)
29
+ }, { immediate: true })
30
+
31
+ onUnmounted(() => {
32
+ inriStore.toggleDirtyComponent(privateId, false)
33
+ })
34
+
35
+ onBeforeRouteUpdate((to) => {
36
+ return handleRouteChange(to)
37
+ })
38
+
39
+ onBeforeRouteLeave((to) => {
40
+ return handleRouteChange(to)
41
+ })
42
+
43
+ function handleRouteChange (to) {
44
+ // If a dialog is open then just do nothing (prevent navigation)
45
+ if (props.isDialogOpen) {
46
+ return false
47
+ }
48
+
49
+ if (props.isDirty && !willRedirect.value) {
50
+ if (!dirtyDialogIsOpen.value) {
51
+ dirtyDialogIsOpen.value = true
52
+ dialog.confirm({
53
+ title: 'unsaved data',
54
+ text: 'are you sure you want to leave the page without saving your data?',
55
+ confirmButtonText: 'yes',
56
+ }).onOk(() => {
57
+ willRedirect.value = true
58
+ router.push(to)
59
+ }).onDismiss(() => {
60
+ dirtyDialogIsOpen.value = false
61
+ })
62
+ return false
63
+ } else {
64
+ return false
65
+ }
66
+ }
67
+ }
68
+ </script>
@@ -1,44 +1,44 @@
1
- <template>
2
- <q-drawer
3
- :data-id="left ? 'left-drawer' : 'right-drawer'"
4
- :model-value="isOpen"
5
- :side="left ? 'left' : 'right'"
6
- bordered
7
- :width="340"
8
- class="overflow-y-overlay"
9
- :overlay="!left"
10
- :breakpoint="600"
11
- @update:model-value="toggle"
12
- >
13
- <slot />
14
- </q-drawer>
15
- </template>
16
-
17
- <script setup lang="ts">
18
- import { useInriStore } from '../stores/inriStore'
19
- import { computed } from 'vue'
20
-
21
- const props = defineProps({
22
- left: {
23
- type: Boolean,
24
- default: false,
25
- },
26
- })
27
-
28
- const inriStore = useInriStore()
29
- const isOpen = computed(() => props.left ? inriStore.state.leftDrawerIsOpen : inriStore.state.rightDrawerIsOpen)
30
-
31
- function toggle () {
32
- if (props.left) {
33
- inriStore.toggleLeftDrawer()
34
- } else {
35
- inriStore.toggleRightDrawer()
36
- }
37
- }
38
- </script>
39
-
40
- <style>
41
- .q-drawer--right {
42
- box-shadow: 0 0 8px rgba(0, 0, 0, 0.2);
43
- }
44
- </style>
1
+ <template>
2
+ <q-drawer
3
+ :data-id="left ? 'left-drawer' : 'right-drawer'"
4
+ :model-value="isOpen"
5
+ :side="left ? 'left' : 'right'"
6
+ bordered
7
+ :width="340"
8
+ class="overflow-y-overlay"
9
+ :overlay="!left"
10
+ :breakpoint="600"
11
+ @update:model-value="toggle"
12
+ >
13
+ <slot />
14
+ </q-drawer>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { useInriStore } from '../stores/inriStore'
19
+ import { computed } from 'vue'
20
+
21
+ const props = defineProps({
22
+ left: {
23
+ type: Boolean,
24
+ default: false,
25
+ },
26
+ })
27
+
28
+ const inriStore = useInriStore()
29
+ const isOpen = computed(() => props.left ? inriStore.state.leftDrawerIsOpen : inriStore.state.rightDrawerIsOpen)
30
+
31
+ function toggle () {
32
+ if (props.left) {
33
+ inriStore.toggleLeftDrawer()
34
+ } else {
35
+ inriStore.toggleRightDrawer()
36
+ }
37
+ }
38
+ </script>
39
+
40
+ <style>
41
+ .q-drawer--right {
42
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.2);
43
+ }
44
+ </style>
@@ -1,91 +1,91 @@
1
- <template>
2
- <q-btn
3
- ref="drawerButton"
4
- data-id="drawer-btn"
5
- class="drawer-button group"
6
- :class="{
7
- 'is-left': left,
8
- 'w-60px sm:w-340px': isOpen,
9
- 'w-60px': !isOpen
10
- }"
11
- :color="color"
12
- :text-color="textColor"
13
- unelevated
14
- :aria-label="$t('inri.toggle_drawer')"
15
- @click="toggle"
16
- >
17
- <c-slide-effect
18
- :parent-color="color"
19
- slide-right
20
- class="-z-1"
21
- />
22
-
23
- <q-icon
24
- :name="!left ? 'mdi-chevron-left' : 'mdi-chevron-right'"
25
- :class="isOpen ? 'rotate-180' : 'rotate-360'"
26
- />
27
- </q-btn>
28
- </template>
29
-
30
- <script setup lang="ts">
31
- import { computed, ref } from 'vue'
32
- import { useInriStore } from '../stores/inriStore'
33
-
34
- const props = defineProps({
35
- left: {
36
- type: Boolean,
37
- default: false,
38
- },
39
- color: {
40
- type: String,
41
- default: 'primary',
42
- },
43
- textColor: {
44
- type: String,
45
- default: 'on-primary',
46
- },
47
- })
48
-
49
- const drawerButton = ref()
50
- const inriStore = useInriStore()
51
- const isOpen = computed(() => props.left ? inriStore.state.leftDrawerIsOpen : inriStore.state.rightDrawerIsOpen)
52
-
53
- function toggle () {
54
- if (props.left) {
55
- inriStore.toggleLeftDrawer()
56
- } else {
57
- inriStore.toggleRightDrawer()
58
- }
59
-
60
- // Remove focus from button on click
61
- drawerButton.value.$el.blur()
62
- }
63
- </script>
64
-
65
- <style lang="scss">
66
- .drawer-button {
67
- height: 60px;
68
- border-radius: 0;
69
- transition: width 0.1s;
70
-
71
- .q-focus-helper {
72
- display: none;
73
- }
74
-
75
- .q-btn__content {
76
- justify-content: start;
77
- }
78
-
79
- .mdi {
80
- transition: all 0.3s;
81
- font-size: 28px;
82
- }
83
- }
84
-
85
- // Left side drawer button
86
- .drawer-button.is-left {
87
- .q-btn__content {
88
- justify-content: end;
89
- }
90
- }
91
- </style>
1
+ <template>
2
+ <q-btn
3
+ ref="drawerButton"
4
+ data-id="drawer-btn"
5
+ class="drawer-button group"
6
+ :class="{
7
+ 'is-left': left,
8
+ 'w-60px sm:w-340px': isOpen,
9
+ 'w-60px': !isOpen
10
+ }"
11
+ :color="color"
12
+ :text-color="textColor"
13
+ unelevated
14
+ :aria-label="$t('inri.toggle_drawer')"
15
+ @click="toggle"
16
+ >
17
+ <c-slide-effect
18
+ :parent-color="color"
19
+ slide-right
20
+ class="-z-1"
21
+ />
22
+
23
+ <q-icon
24
+ :name="!left ? 'mdi-chevron-left' : 'mdi-chevron-right'"
25
+ :class="isOpen ? 'rotate-180' : 'rotate-360'"
26
+ />
27
+ </q-btn>
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ import { computed, ref } from 'vue'
32
+ import { useInriStore } from '../stores/inriStore'
33
+
34
+ const props = defineProps({
35
+ left: {
36
+ type: Boolean,
37
+ default: false,
38
+ },
39
+ color: {
40
+ type: String,
41
+ default: 'primary',
42
+ },
43
+ textColor: {
44
+ type: String,
45
+ default: 'on-primary',
46
+ },
47
+ })
48
+
49
+ const drawerButton = ref()
50
+ const inriStore = useInriStore()
51
+ const isOpen = computed(() => props.left ? inriStore.state.leftDrawerIsOpen : inriStore.state.rightDrawerIsOpen)
52
+
53
+ function toggle () {
54
+ if (props.left) {
55
+ inriStore.toggleLeftDrawer()
56
+ } else {
57
+ inriStore.toggleRightDrawer()
58
+ }
59
+
60
+ // Remove focus from button on click
61
+ drawerButton.value.$el.blur()
62
+ }
63
+ </script>
64
+
65
+ <style lang="scss">
66
+ .drawer-button {
67
+ height: 60px;
68
+ border-radius: 0;
69
+ transition: width 0.1s;
70
+
71
+ .q-focus-helper {
72
+ display: none;
73
+ }
74
+
75
+ .q-btn__content {
76
+ justify-content: start;
77
+ }
78
+
79
+ .mdi {
80
+ transition: all 0.3s;
81
+ font-size: 28px;
82
+ }
83
+ }
84
+
85
+ // Left side drawer button
86
+ .drawer-button.is-left {
87
+ .q-btn__content {
88
+ justify-content: end;
89
+ }
90
+ }
91
+ </style>
@@ -1,57 +1,57 @@
1
- <template>
2
- <q-expansion-item
3
- :label="label"
4
- :header-class="headerClass"
5
- class="c-expansion-item"
6
- >
7
- <slot />
8
- </q-expansion-item>
9
- </template>
10
-
11
- <script setup lang="ts">
12
- defineProps({
13
- label: {
14
- type: String,
15
- default: undefined,
16
- },
17
- headerClass: {
18
- type: String,
19
- default: undefined,
20
- },
21
- })
22
- </script>
23
-
24
- <style lang="scss">
25
- .c-expansion-item {
26
- border-bottom: 1px solid var(--color-border);
27
-
28
- .q-item__section {
29
- padding: 0;
30
- }
31
-
32
- .q-expansion-item__container {
33
- .q-item {
34
- padding-right: 12px;
35
- }
36
- }
37
-
38
- .q-item__label {
39
- line-height: 1.5em !important;
40
- font-weight: 600;
41
- overflow: hidden;
42
- text-overflow: ellipsis;
43
- white-space: nowrap;
44
- }
45
-
46
- .q-expansion-item__toggle-icon {
47
- color: var(--color-grey-darkest);
48
- font-size: 22px;
49
- }
50
-
51
- // Selected link
52
- .q-router-link--exact-active {
53
- background: var(--item-selected-bg-color);
54
- font-weight: 600;
55
- }
56
- }
57
- </style>
1
+ <template>
2
+ <q-expansion-item
3
+ :label="label"
4
+ :header-class="headerClass"
5
+ class="c-expansion-item"
6
+ >
7
+ <slot />
8
+ </q-expansion-item>
9
+ </template>
10
+
11
+ <script setup lang="ts">
12
+ defineProps({
13
+ label: {
14
+ type: String,
15
+ default: undefined,
16
+ },
17
+ headerClass: {
18
+ type: String,
19
+ default: undefined,
20
+ },
21
+ })
22
+ </script>
23
+
24
+ <style lang="scss">
25
+ .c-expansion-item {
26
+ border-bottom: 1px solid var(--color-border);
27
+
28
+ .q-item__section {
29
+ padding: 0;
30
+ }
31
+
32
+ .q-expansion-item__container {
33
+ .q-item {
34
+ padding-right: 12px;
35
+ }
36
+ }
37
+
38
+ .q-item__label {
39
+ line-height: 1.5em !important;
40
+ font-weight: 600;
41
+ overflow: hidden;
42
+ text-overflow: ellipsis;
43
+ white-space: nowrap;
44
+ }
45
+
46
+ .q-expansion-item__toggle-icon {
47
+ color: var(--color-grey-darkest);
48
+ font-size: 22px;
49
+ }
50
+
51
+ // Selected link
52
+ .q-router-link--exact-active {
53
+ background: var(--item-selected-bg-color);
54
+ font-weight: 600;
55
+ }
56
+ }
57
+ </style>
@@ -1,41 +1,41 @@
1
- <template>
2
- <q-expansion-item
3
- :header-class="headerClass"
4
- class="c-expansion-item"
5
- >
6
- <template #header>
7
- <q-checkbox
8
- :model-value="modelValue"
9
- v-bind="$inri.checkbox"
10
- @update:model-value="$emit('update:modelValue', $event)"
11
- />
12
- <div class="ml-3 flex-1 flex align-middle items-center overflow-hidden">
13
- <span class="truncate">{{ label }}</span>
14
- </div>
15
- </template>
16
- <slot />
17
- </q-expansion-item>
18
- </template>
19
-
20
- <script setup lang="ts">
21
- defineEmits(['update:modelValue'])
22
-
23
- defineProps({
24
- modelValue: {
25
- type: Boolean,
26
- default: undefined,
27
- },
28
- label: {
29
- type: String,
30
- default: undefined,
31
- },
32
- headerClass: {
33
- type: String,
34
- default: undefined,
35
- },
36
- })
37
- </script>
38
-
39
- <style>
40
- /* shared */
41
- </style>
1
+ <template>
2
+ <q-expansion-item
3
+ :header-class="headerClass"
4
+ class="c-expansion-item"
5
+ >
6
+ <template #header>
7
+ <q-checkbox
8
+ :model-value="modelValue"
9
+ v-bind="$inri.checkbox"
10
+ @update:model-value="$emit('update:modelValue', $event)"
11
+ />
12
+ <div class="ml-3 flex-1 flex align-middle items-center overflow-hidden">
13
+ <span class="truncate">{{ label }}</span>
14
+ </div>
15
+ </template>
16
+ <slot />
17
+ </q-expansion-item>
18
+ </template>
19
+
20
+ <script setup lang="ts">
21
+ defineEmits(['update:modelValue'])
22
+
23
+ defineProps({
24
+ modelValue: {
25
+ type: Boolean,
26
+ default: undefined,
27
+ },
28
+ label: {
29
+ type: String,
30
+ default: undefined,
31
+ },
32
+ headerClass: {
33
+ type: String,
34
+ default: undefined,
35
+ },
36
+ })
37
+ </script>
38
+
39
+ <style>
40
+ /* shared */
41
+ </style>