Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge 'feature-itsm' into 'master' #5259

Merged
merged 76 commits into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
ed48742
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 14, 2024
2c2beb3
feat: add itsm routes and related files & add markup and store of tas…
WANZARGEN Nov 14, 2024
0b1f674
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 14, 2024
23f6584
Merge branch 'master' into feature-itsm
WANZARGEN Nov 18, 2024
c074014
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 20, 2024
9c1a415
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 20, 2024
ee8eeef
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 21, 2024
dd78ef9
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 21, 2024
fd0db3e
feat: update package and workspace interfaces, update existing models
WANZARGEN Nov 18, 2024
fd839dc
chore: fix wrong type path
WANZARGEN Nov 20, 2024
f5ec9cd
feat: add enable landing page component
WANZARGEN Nov 20, 2024
e4ab743
feat: replace AddOrEditPackageModal with PackageForm component
WANZARGEN Nov 20, 2024
e1bed92
feat: update task management UI components and forms
WANZARGEN Nov 20, 2024
802f4bd
refactor: rename and restructure category modal component
WANZARGEN Nov 20, 2024
a19d8b6
feat: update task status and package handling logic
WANZARGEN Nov 20, 2024
fd86b17
feat(package-form): enhance package management with workspace and cat…
WANZARGEN Nov 20, 2024
a416acc
feat(packageForm): set initial categories on package selection
WANZARGEN Nov 20, 2024
b7afc59
feat(itsm): update category and package forms to use getters for stat…
WANZARGEN Nov 20, 2024
b687174
feat(itsm): enhance CategoryForm and PackageForm with improved layout…
WANZARGEN Nov 20, 2024
66f4c6a
feat(category-form): reset validations on category form visibility ch…
WANZARGEN Nov 20, 2024
f6f2ac3
feat: rename itsm to ops-flow and update related configurations
WANZARGEN Nov 21, 2024
8099032
feat: add markups and data binding of task category page (#5073)
WANZARGEN Nov 21, 2024
102341e
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 25, 2024
502f6e6
Add: icon for field type (#5083)
h22y25n Nov 25, 2024
0816f42
feat: add task management deletion scenarios (#5086)
WANZARGEN Nov 25, 2024
34fb663
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 25, 2024
751dca7
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 26, 2024
fc50870
feat: add task category field validation and bind package & category …
WANZARGEN Nov 27, 2024
fea6888
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 28, 2024
0409d9b
Merge branch 'master' into feature-itsm
WANZARGEN Nov 28, 2024
5f01c1b
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 28, 2024
f8d2d70
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Nov 29, 2024
f399c5e
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Dec 2, 2024
98291c3
refactor: update state management to use getters for task categories …
WANZARGEN Dec 2, 2024
e932d14
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Dec 3, 2024
fba6fc1
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Dec 3, 2024
9e2d1f1
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Dec 4, 2024
512beeb
Merge branch 'master' into feature-itsm
WANZARGEN Dec 5, 2024
bd1ee8d
feat(ops-flow): add link to task details in BoardTaskTable and improv…
WANZARGEN Dec 2, 2024
af01774
feat: add showInBox prop to TextEditorViewer and update styles
WANZARGEN Dec 3, 2024
c2f73c2
feat(task): add comment deletion interface and update task type handling
WANZARGEN Dec 3, 2024
2cda63c
feat(comment): implement comment management with store integration an…
WANZARGEN Dec 3, 2024
daa3e46
feat: add reset methods to stores and define multi-selection field types
WANZARGEN Dec 3, 2024
48bef17
feat(task-type): add support for including category fields in task ty…
WANZARGEN Dec 4, 2024
cad8805
fix(task-content-form-store): add currentTaskType to store state mana…
WANZARGEN Dec 4, 2024
2258d16
feat(ops-flow): add associated tasks component and integrate with del…
WANZARGEN Dec 4, 2024
3ab4576
feat(ops-flow): pass tasks as props to AssociatedTasks component
WANZARGEN Dec 4, 2024
5e96dc3
feat(ops-flow): update select card styling for improved layout
WANZARGEN Dec 4, 2024
b7c3e70
feat(ops-flow): add task type selection and improve category handling…
WANZARGEN Dec 4, 2024
cc5ab95
feat(ops-flow): replace button with router link for ticket navigation
WANZARGEN Dec 4, 2024
e16f49f
feat(router): add ops flow landing route and update external pages list
WANZARGEN Dec 4, 2024
f8c5e9c
feat(landing): add task loading and category selection functionality
WANZARGEN Dec 4, 2024
b4cd932
Merge branch 'master' into feature-itsm
WANZARGEN Dec 6, 2024
92d1391
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Dec 10, 2024
7eb78ed
feat(task-detail-page): add event handling and comment functionality
WANZARGEN Dec 5, 2024
748c406
feat(task-detail-page-store): improve event loading logic and state m…
WANZARGEN Dec 5, 2024
31d6777
feat: add TaskContentTab component and rename TaskCreateProgressTab t…
WANZARGEN Dec 5, 2024
5f3955c
feat(ops-flow): update comment handling to support direct input and e…
WANZARGEN Dec 5, 2024
6445db9
feat(comment): add comment deletion functionality and author display
WANZARGEN Dec 5, 2024
5d18c90
feat(ops-flow): add loading state for comment submission and deletion
WANZARGEN Dec 5, 2024
896f59f
feat(task-content-form): add file management to task creation and edi…
WANZARGEN Dec 6, 2024
b4aca85
refactor: replace store usage with userStore for better state management
WANZARGEN Dec 7, 2024
2f3d77c
feat(task-field-validation): add deep comparison for value updates in…
WANZARGEN Dec 7, 2024
81a3532
feat(ops-flow): update task content form to use readonly instead of d…
WANZARGEN Dec 7, 2024
dcd8f2c
feat(task-assign-modal): add task assignment modal and related functi…
WANZARGEN Dec 9, 2024
f7d0667
feat(task): implement task assignment and deletion modals with state …
WANZARGEN Dec 9, 2024
d31829b
feat(task): enhance task form with improved validation and error hand…
WANZARGEN Dec 9, 2024
a4bcddf
feat(delete-modal): emit 'closed' event on modal closed action
WANZARGEN Dec 9, 2024
be337ff
feat(ops-flow): add task categories and types loading in BoardTaskTab…
WANZARGEN Dec 9, 2024
c4024c9
feat(ops-flow): enhance BoardTaskTable with new fields and date forma…
WANZARGEN Dec 9, 2024
3e483e0
feat(menu): remove workflow menu and update icons for support center …
WANZARGEN Dec 9, 2024
a6d1f3a
feat(ops-flow): conditionally render field groups based on target pac…
WANZARGEN Dec 9, 2024
0932e6a
feat(task-management): add task management templates and translations
WANZARGEN Dec 9, 2024
b6a0a1a
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Dec 12, 2024
0f41d05
Merge remote-tracking branch 'origin/master' into feature-itsm
WANZARGEN Dec 12, 2024
3aa3c96
feat: add task management languages and deletion scenarios (#5217)
WANZARGEN Dec 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"@tiptap/core": "^2.0.3",
"@tiptap/extension-color": "^2.0.3",
"@tiptap/extension-link": "^2.0.3",
"@tiptap/extension-placeholder": "^2.10.2",
"@tiptap/extension-text-align": "^2.0.3",
"@tiptap/extension-text-style": "^2.0.3",
"@tiptap/extension-underline": "^2.0.3",
Expand All @@ -53,6 +54,7 @@
"diff-match-patch": "^1.0.5",
"echarts": "^5.5.0",
"ejs": "^3.1.10",
"hangul-js": "^0.2.6",
"hashids": "^2.2.1",
"highlight.js": "^11.5.1",
"html-to-image": "^1.9.0",
Expand Down
15 changes: 15 additions & 0 deletions apps/web/src/common/components/editor/TextEditor.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {

import { Color } from '@tiptap/extension-color';
import Link from '@tiptap/extension-link';
import Placeholder from '@tiptap/extension-placeholder';
import TextAlign from '@tiptap/extension-text-align';
import TextStyle from '@tiptap/extension-text-style';
import Underline from '@tiptap/extension-underline';
Expand All @@ -23,6 +24,7 @@ interface Props {
imageUploader?: ImageUploader<any>;
attachments?: Attachment<any>[];
invalid?: boolean;
placeholder?: string;
}
const props = withDefaults(defineProps<Props>(), {
value: '',
Expand All @@ -32,6 +34,7 @@ const props = withDefaults(defineProps<Props>(), {
}),
attachments: () => [],
invalid: false,
placeholder: '',
});
const emit = defineEmits<{(e: 'update:value', value: string): void;
(e: 'update:attachments', attachments: Attachment<any>[]): void;
Expand Down Expand Up @@ -60,6 +63,9 @@ onMounted(() => {
},
},
}),
Placeholder.configure({
placeholder: props.placeholder,
}),
Underline,
Link,
TextStyle,
Expand Down Expand Up @@ -112,6 +118,15 @@ watch([() => props.value, () => props.attachments], ([value, attachments], prev)
&:focus {
@apply outline-none;
}

/* Placeholder (at the top) */
p.is-editor-empty:first-child::before {
@apply text-gray-400;
content: attr(data-placeholder);
float: left;
height: 0;
pointer-events: none;
}
}
}
}
Expand Down
13 changes: 10 additions & 3 deletions apps/web/src/common/components/editor/TextEditorViewer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ import type { Attachment } from '@/common/components/editor/extensions/image/typ
import { loadMonospaceFonts } from '@/styles/fonts';

interface Props {
contents?: string,
attachments?: Attachment[]
contents?: string;
attachments?: Attachment[];
showInBox?: boolean
}
const props = withDefaults(defineProps<Props>(), {
contents: '',
attachments: () => [],
showInBox: false,
});

loadMonospaceFonts();
Expand All @@ -22,6 +24,7 @@ const refinedContents = computed(() => setAttachmentsToContents(props.contents,
<template>
<!-- eslint-disable-next-line vue/no-v-html-->
<div class="text-editor-contents"
:class="{'contents-box': props.showInBox}"
v-html="refinedContents"
/>
</template>
Expand All @@ -31,6 +34,10 @@ const refinedContents = computed(() => setAttachmentsToContents(props.contents,
.text-editor-contents {
margin-left: 0.1rem;

&.contents-box {
@apply ml-0 p-2 min-h-21 border border-gray-300 rounded-md;
}

@mixin all-nodes-style;

img:active {
Expand All @@ -41,4 +48,4 @@ const refinedContents = computed(() => setAttachmentsToContents(props.contents,
@apply ml-1;
}
}
</style>
</style>
118 changes: 118 additions & 0 deletions apps/web/src/common/components/inputs/LabelsInput.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<script setup lang="ts">
// CAUTION: this vOnClickOutside is using !! Please do not remove.
import { vOnClickOutside } from '@vueuse/components';
import {
watch, ref,
} from 'vue';

import {
PIconButton, PLabel, PTextInput,
} from '@cloudforet/mirinae';

import { i18n } from '@/translations';

import { useFieldValidator } from '@/common/composables/form-validator';

const props = defineProps<{
labels?: string[];
editable?: boolean;
}>();
const emit = defineEmits<{(event: 'update:labels', value: string[]): void;
}>();


const labelList = ref<string[]>([]);

const {
value, setValue, isInvalid, invalidText,
} = useFieldValidator(
'',
(val: string) => {
if (val.length > 30) return i18n.t('DASHBOARDS.CUSTOMIZE.VALIDATION_LIMITED_CHAR_LABEL');
if (labelList.value.find((d) => d === val)) return i18n.t('DASHBOARDS.CUSTOMIZE.VALIDATION_DUPLICATED_LABEL');
return '';
},
);

const inputMode = ref(false);
const isInputFocused = ref(false);

const handleClickPlus = async () => {
inputMode.value = true;
isInputFocused.value = true;
};
const handleKeyEscape = () => {
inputMode.value = false;
setValue('');
};
const handleKeyEnter = (e: KeyboardEvent) => {
if (e.isComposing || !value.value || isInvalid.value) return;
labelList.value.push(value.value);
setValue('');
emit('update:labels', labelList.value);
};
const handleClickDelete = (index: number) => {
labelList.value.splice(index, 1);
emit('update:labels', labelList.value);
};
watch(() => props.labels, (newLabels) => {
labelList.value = newLabels || [];
}, { immediate: true });
</script>

<template>
<div class="flex flex-wrap items-start gap-1 min-h-8"
@keydown.esc="handleKeyEscape"
@keydown.enter="handleKeyEnter"
>
<div class="flex flex-wrap items-center gap-1 min-h-6">
<p-label
v-for="(label, index) in labelList"
:key="`dashboard-label-${index}`"
:text="label"
:deletable="props.editable"
@delete="handleClickDelete(index)"
/>
<p-icon-button v-if="!inputMode && props.editable"
class="mr-1"
style-type="tertiary"
name="ic_plus_bold"
size="sm"
shape="square"
@click="handleClickPlus"
/>
<template v-if="!inputMode && !labelList.length">
<span v-if="props.editable"
class="text-gray-500 text-xs pt-1 cursor-pointer"
@click="handleClickPlus"
>
{{ $t('DASHBOARDS.CUSTOMIZE.ADD_LABEL') }}
</span>
<div v-else
class="text-gray-300 text-xs"
>
{{ $t('DASHBOARDS.CUSTOMIZE.NO_LABEL') }}
</div>
</template>
</div>
<div v-if="inputMode"
v-on-click-outside="handleKeyEscape"
class="min-w-40 max-w-40"
>
<p-text-input :value="value"
:is-focused="isInputFocused"
:invalid="isInvalid"
block
size="sm"
:placeholder="$t('DASHBOARDS.CUSTOMIZE.ENTER_NEW_LABEL')"
@update:value="setValue"
@update:is-focused="isInputFocused = $event"
/>
<p v-if="isInvalid"
class="text-label-sm text-alert mt-1"
>
{{ invalidText }}
</p>
</div>
</div>
</template>
1 change: 1 addition & 0 deletions apps/web/src/common/components/modals/DeleteModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
:hide-header-close-button="hideCloseButton"
@confirm="handleConfirm"
@close="$emit('close')"
@closed="$emit('closed')"
@cancel="$emit('cancel')"
>
<template #body>
Expand Down
20 changes: 14 additions & 6 deletions apps/web/src/common/modules/navigations/gnb/GNBNavigationRail.vue
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,20 @@ const handleMenuDescription = (value?: boolean) => {
const handleMinimizedGnbRail = () => {
gnbStore.createMinimizeNavRail(!gnbGetters.isMinimizeNavRail);
};
const convertGNBMenuToMenuItem = (menuList: DisplayMenu[], menuType: ContextMenuType = 'item'): GNBMenuType[] => menuList.map((menu) => ({
...menu,
name: menu.id,
type: menuType,
disabled: menuType === 'header' && menu.id.includes('cost'),
}));
const convertGNBMenuToMenuItem = (menuList: DisplayMenu[], menuType: ContextMenuType = 'item'): GNBMenuType[] => {
const results: GNBMenuType[] = [];
menuList.forEach((menu) => {
if (!menu.hideOnGNB && !menu.hideOnSiteMap) {
results.push({
...menu,
name: menu.id,
type: menuType,
disabled: menuType === 'header' && menu.id.includes('cost'),
});
}
});
return results;
};
const refinedMenuList = (list, value) => {
const index = list.findIndex((d) => d.id === value);
if (index !== -1) {
Expand Down
10 changes: 9 additions & 1 deletion apps/web/src/common/modules/project/ProjectSelectDropdown.vue
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ interface Props {
workspaceId?: string;
isInitSelectedItem?: boolean;
block?: boolean;
styleType?: string;
appearanceType?: 'stack';
showDeleteAllButton?: boolean;
}

const props = withDefaults(defineProps<Props>(), {
Expand All @@ -64,6 +67,9 @@ const props = withDefaults(defineProps<Props>(), {
hideCreateButton: false,
workspaceId: undefined,
isInitSelectedItem: false,
styleType: undefined,
appearanceType: undefined,
showDeleteAllButton: undefined,
});

const emit = defineEmits<{(e: 'select', value: ProjectTreeNodeData[]): void;
Expand Down Expand Up @@ -303,8 +309,10 @@ watch(() => state._selectedProjectIds, (selectedProjectIds) => {
:readonly="props.readonly"
:menu-position="props.position"
disable-handler
:show-delete-all-button="props.showDeleteAllButton"
:style-type="props.styleType"
:block="props.block"
appearance-type="stack"
:appearance-type="props.appearanceType"
:is-filterable="!props.readonly"
@update:visible-menu="handleUpdateVisibleMenu"
@delete-tag="handleDeleteTag"
Expand Down
22 changes: 20 additions & 2 deletions apps/web/src/common/modules/user/UserSelectDropdown.vue
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ const props = withDefaults(defineProps<{
disabled?: boolean;
readonly?: boolean;
userPool?: string[];
selectionLabel?: string;
appearanceType?: string;
styleType?: string;
block?: boolean;
}>(), {
userId: '',
userIds: () => [],
Expand All @@ -36,6 +40,10 @@ const props = withDefaults(defineProps<{
invalid: false,
disabled: false,
userPool: undefined,
selectionLabel: undefined,
appearanceType: 'badge',
styleType: undefined,
block: undefined,
});

const emit = defineEmits<{(event: 'update:user-ids', value: string[]): void;
Expand Down Expand Up @@ -122,7 +130,8 @@ watch([loading, () => props.userId, () => props.userIds], ([_loading, newUserId,
</script>

<template>
<p-select-dropdown show-select-marker
<p-select-dropdown class="user-select-dropdown"
show-select-marker
:selected="selectedUserItems"
:handler="userMenuItemsHandler"
:page-size="10"
Expand All @@ -133,7 +142,16 @@ watch([loading, () => props.userId, () => props.userIds], ([_loading, newUserId,
:use-fixed-menu-style="useFixedMenuStyle"
show-delete-all-button
:multi-selectable="props.selectionType === 'multiple'"
appearance-type="badge"
:selection-label="props.selectionLabel"
:appearance-type="props.appearanceType"
:style-type="props.styleType"
:block="props.block"
@update:selected="handleUpdateSelectedUserItems"
/>
</template>

<style scoped lang="postcss">
.user-select-dropdown {
width: fit-content;
}
</style>
6 changes: 6 additions & 0 deletions apps/web/src/lib/access-control/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ export const WORKSPACE_OWNER_DEFAULT_PERMISSIONS: MenuId[] = [
MENU_ID.NOTIFICATIONS,
MENU_ID.INFO,
MENU_ID.NOTICE,
MENU_ID.OPS_FLOW,
MENU_ID.OPS_FLOW_LANDING,
MENU_ID.TASK_BOARD,
];
export const WORKSPACE_MEMBER_DEFAULT_PERMISSIONS: MenuId[] = [
MENU_ID.WORKSPACE_HOME,
Expand All @@ -68,6 +71,9 @@ export const WORKSPACE_MEMBER_DEFAULT_PERMISSIONS: MenuId[] = [
MENU_ID.NOTIFICATIONS,
MENU_ID.INFO,
MENU_ID.NOTICE,
MENU_ID.OPS_FLOW,
MENU_ID.OPS_FLOW_LANDING,
MENU_ID.TASK_BOARD,
];

// HACK: this need to be changed with new SYSTEM domain planning
Expand Down
4 changes: 4 additions & 0 deletions apps/web/src/lib/menu/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ export const MENU_ID = Object.freeze({
INFO: 'info',
NOTICE: 'notice',
METRIC_EXPLORER: 'metric_explorer',
OPS_FLOW: 'ops_flow',
OPS_FLOW_LANDING: 'ops_flow_landing',
TASK_BOARD: 'task_board',
TASK_MANAGEMENT: 'task_management',
} as const);

export type MenuId = typeof MENU_ID[keyof typeof MENU_ID];
Expand Down
Loading
Loading