@inriver/inri 1.13.0 → 1.15.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 (119) 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 +6 -0
  5. package/azure/pipelines/templates/deployFramework.yml +50 -0
  6. package/componentProperties.d.ts +8 -8
  7. package/configs/base-eslint-config.js +36 -36
  8. package/configs/base-tailwind-config.js +149 -149
  9. package/i18n.ts +11 -11
  10. package/index.ts +29 -29
  11. package/package.json +7 -2
  12. package/src/components/CAutoBreadcrumbs.vue +72 -72
  13. package/src/components/CBtn.vue +98 -98
  14. package/src/components/CColorPicker.vue +55 -55
  15. package/src/components/CContextMenu.vue +29 -29
  16. package/src/components/CDatePicker.vue +51 -51
  17. package/src/components/CDeleteTileBtn.vue +52 -52
  18. package/src/components/CDialog.vue +253 -253
  19. package/src/components/CDialogCloseBtn.vue +9 -9
  20. package/src/components/CDirtyCheck.vue +68 -68
  21. package/src/components/CDrawer.vue +44 -44
  22. package/src/components/CDrawerButton.vue +91 -91
  23. package/src/components/CExpansionItem.vue +57 -57
  24. package/src/components/CExpansionItemWithCheckbox.vue +41 -41
  25. package/src/components/CFileDropzone.vue +114 -114
  26. package/src/components/CGrid.vue +101 -101
  27. package/src/components/CHeader.vue +10 -10
  28. package/src/components/CHeaderLinks.vue +61 -61
  29. package/src/components/CHeaderMenuLink.vue +51 -51
  30. package/src/components/CHeaderSearch.vue +142 -142
  31. package/src/components/CIconBtn.vue +70 -70
  32. package/src/components/CMenuItem.vue +66 -66
  33. package/src/components/CPageContainer.vue +11 -11
  34. package/src/components/CPageError.vue +24 -24
  35. package/src/components/CPageSpinner.vue +18 -18
  36. package/src/components/CSearch.vue +45 -45
  37. package/src/components/CSection.vue +29 -29
  38. package/src/components/CSectionTitle.vue +8 -8
  39. package/src/components/CSelect.vue +208 -208
  40. package/src/components/CSlideEffect.vue +62 -62
  41. package/src/components/CSpinner.vue +107 -107
  42. package/src/components/CTableActions.vue +16 -16
  43. package/src/components/CTileBtn.vue +178 -178
  44. package/src/components/CTimePicker.vue +42 -42
  45. package/src/components/CToggleGridView.vue +26 -26
  46. package/src/components/CToggleSidebarBtn.vue +19 -19
  47. package/src/components/CTooltip.vue +44 -44
  48. package/src/components/CTreeNode.vue +39 -39
  49. package/src/components/cards/CBannerCard.vue +103 -103
  50. package/src/components/cards/CSmallCard.vue +149 -149
  51. package/src/components/internal-components/ConfirmDialog.vue +78 -78
  52. package/src/composables/useDialog.ts +46 -46
  53. package/src/composables/useDirtyCheck.ts +25 -25
  54. package/src/composables/useDoubleClickListener.ts +28 -28
  55. package/src/composables/useSelectable.ts +62 -62
  56. package/src/composables/useTruncateChips.ts +46 -46
  57. package/src/i18n/de/index.ts +17 -17
  58. package/src/i18n/en/index.ts +84 -84
  59. package/src/i18n/es/index.ts +7 -7
  60. package/src/i18n/fr/index.ts +7 -7
  61. package/src/init/initInriFramework.ts +37 -37
  62. package/src/init/useInriApp.ts +55 -55
  63. package/src/layouts/CLayoutBlank.vue +7 -7
  64. package/src/layouts/CLayoutWithBackButton.vue +50 -50
  65. package/src/layouts/CLayoutWithSidebars.vue +46 -46
  66. package/src/layouts/layout-fragments/CPageAutoBreadcrumbs.vue +6 -6
  67. package/src/layouts/layout-fragments/CPageBackButton.vue +18 -18
  68. package/src/layouts/layout-fragments/CPageBlank.vue +20 -20
  69. package/src/layouts/layout-fragments/CPageFlexCol.vue +5 -5
  70. package/src/layouts/layout-fragments/CPageLeftSidebar.vue +5 -5
  71. package/src/layouts/layout-fragments/CPageMainContent.vue +5 -5
  72. package/src/layouts/layout-fragments/CPageOuterWrapper.vue +5 -5
  73. package/src/layouts/layout-fragments/CPageRightSidebar.vue +5 -5
  74. package/src/layouts/layout-fragments/CPageTitle.vue +34 -34
  75. package/src/plugins/dialog.ts +45 -45
  76. package/src/plugins/errors/ErrorFactories.ts +59 -59
  77. package/src/plugins/errors/Errors.ts +156 -156
  78. package/src/plugins/errors/Exception.ts +6 -6
  79. package/src/plugins/errors/globalErrorHandler.ts +21 -21
  80. package/src/plugins/errors/handleError.ts +34 -34
  81. package/src/plugins/errors/logger.ts +16 -16
  82. package/src/plugins/errors/vueErrorHandler.ts +26 -26
  83. package/src/plugins/globalAppConfig.ts +25 -25
  84. package/src/plugins/i18n.ts +46 -46
  85. package/src/plugins/inriIcons.ts +58 -58
  86. package/src/plugins/inriverQuasarComponentConfigurations.ts +67 -67
  87. package/src/plugins/library.ts +119 -119
  88. package/src/plugins/notify.ts +153 -153
  89. package/src/plugins/quasar-user-options.ts +19 -19
  90. package/src/plugins/validationRules.ts +292 -292
  91. package/src/shims-vue.d.ts +6 -6
  92. package/src/stores/inriStore.ts +54 -54
  93. package/src/stores/interfaceLanguageStore.ts +27 -27
  94. package/src/styles/_css-variables.scss +101 -101
  95. package/src/styles/_reset.scss +67 -67
  96. package/src/styles/_transitions.scss +9 -9
  97. package/src/styles/_utils.scss +15 -15
  98. package/src/styles/components/_breadcrumbs.scss +3 -3
  99. package/src/styles/components/_checkboxes.scss +17 -17
  100. package/src/styles/components/_chips.scss +17 -17
  101. package/src/styles/components/_forms.scss +203 -203
  102. package/src/styles/components/_menu.scss +12 -12
  103. package/src/styles/components/_notifications.scss +24 -24
  104. package/src/styles/components/_q-editor.scss +14 -14
  105. package/src/styles/components/_radio-buttons.scss +17 -17
  106. package/src/styles/components/_tables.scss +92 -92
  107. package/src/styles/components/_tooltips.scss +5 -5
  108. package/src/styles/components/_tree.scss +86 -86
  109. package/src/styles/components/_truncated-chips.scss +39 -39
  110. package/src/styles/main.scss +45 -45
  111. package/src/styles/quasar.variables.scss +50 -50
  112. package/src/styles/tailwind/index.css +2 -2
  113. package/src/typings.d.ts +70 -70
  114. package/src/utils/colorUtils.ts +73 -73
  115. package/src/utils/errorUtils.ts +37 -37
  116. package/src/utils/fileUtils.ts +57 -57
  117. package/src/utils/helpers.ts +6 -6
  118. package/src/utils/routeUtils.ts +23 -23
  119. 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>