@app-studio/web 0.9.36 → 0.9.37
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.
- package/dist/components/Calendar/Calendar/Calendar.props.d.ts +8 -0
- package/dist/components/KanbanBoard/KanbanBoard/KanbanBoard.props.d.ts +5 -0
- package/dist/components/KanbanBoard/KanbanBoard/KanbanBoard.state.d.ts +7 -3
- package/dist/web.cjs.development.js +345 -44
- package/dist/web.cjs.development.js.map +1 -1
- package/dist/web.cjs.production.min.js +1 -1
- package/dist/web.cjs.production.min.js.map +1 -1
- package/dist/web.esm.js +345 -44
- package/dist/web.esm.js.map +1 -1
- package/dist/web.umd.development.js +345 -44
- package/dist/web.umd.development.js.map +1 -1
- package/dist/web.umd.production.min.js +1 -1
- package/dist/web.umd.production.min.js.map +1 -1
- package/docs/components/Calendar.mdx +3 -0
- package/docs/components/KanbanBoard.mdx +4 -0
- package/package.json +1 -1
|
@@ -5,6 +5,8 @@ export interface CalendarEvent {
|
|
|
5
5
|
id: string;
|
|
6
6
|
/** Event title/label */
|
|
7
7
|
title: string;
|
|
8
|
+
/** Event description */
|
|
9
|
+
description?: string;
|
|
8
10
|
/** Start date in ISO format (YYYY-MM-DD) or datetime (YYYY-MM-DDTHH:MM) */
|
|
9
11
|
start: string;
|
|
10
12
|
/** End date in ISO format (YYYY-MM-DD) or datetime (YYYY-MM-DDTHH:MM) */
|
|
@@ -63,6 +65,12 @@ export interface CalendarProps {
|
|
|
63
65
|
onViewChange?: (view: CalendarView) => void;
|
|
64
66
|
/** Callback when double-clicking to add new event */
|
|
65
67
|
onEventAdd?: (start: string, end: string) => void;
|
|
68
|
+
/** Callback when an event's title changes */
|
|
69
|
+
onEventTitleChange?: (event: CalendarEvent, newTitle: string) => void;
|
|
70
|
+
/** Callback when an event's description changes */
|
|
71
|
+
onEventDescriptionChange?: (event: CalendarEvent, newDescription: string) => void;
|
|
72
|
+
/** Callback when an event is deleted */
|
|
73
|
+
onEventDelete?: (event: CalendarEvent) => void;
|
|
66
74
|
/** Style overrides for various parts of the component */
|
|
67
75
|
views?: CalendarViews;
|
|
68
76
|
/** Width of the calendar (default: '100%') */
|
|
@@ -19,6 +19,11 @@ export interface KanbanBoardColumn {
|
|
|
19
19
|
export interface KanbanBoardProps {
|
|
20
20
|
columns: KanbanBoardColumn[];
|
|
21
21
|
onChange?: (columns: KanbanBoardColumn[]) => void;
|
|
22
|
+
onCardMove?: (card: KanbanBoardCard, fromColumn: KanbanBoardColumn, toColumn: KanbanBoardColumn) => void;
|
|
23
|
+
onCardCreate?: (card: KanbanBoardCard, column: KanbanBoardColumn) => void;
|
|
24
|
+
onCardDelete?: (card: KanbanBoardCard, column: KanbanBoardColumn) => void;
|
|
25
|
+
onCardTitleChange?: (card: KanbanBoardCard, column: KanbanBoardColumn, newTitle: string) => void;
|
|
26
|
+
onCardDescriptionChange?: (card: KanbanBoardCard, column: KanbanBoardColumn, newDescription: string) => void;
|
|
22
27
|
renderCard?: (card: KanbanBoardCard, column: KanbanBoardColumn) => React.ReactNode;
|
|
23
28
|
renderColumnHeader?: (column: KanbanBoardColumn) => React.ReactNode;
|
|
24
29
|
renderEmptyState?: (column: KanbanBoardColumn) => React.ReactNode;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
|
-
import { KanbanBoardProps } from './KanbanBoard.props';
|
|
3
|
-
export declare const useKanbanBoardState: ({ columns: initialColumns, onChange, }: KanbanBoardProps) => {
|
|
4
|
-
columns:
|
|
2
|
+
import { KanbanBoardCard, KanbanBoardColumn, KanbanBoardProps } from './KanbanBoard.props';
|
|
3
|
+
export declare const useKanbanBoardState: ({ columns: initialColumns, onChange, onCardMove, onCardCreate: onCardCreateProp, onCardDelete: onCardDeleteProp, onCardTitleChange: onCardTitleChangeProp, onCardDescriptionChange: onCardDescriptionChangeProp, }: KanbanBoardProps) => {
|
|
4
|
+
columns: KanbanBoardColumn[];
|
|
5
5
|
draggedCardId: string | null;
|
|
6
6
|
hoveredColumnId: string | null;
|
|
7
7
|
onCardDragStart: (columnId: string, cardId: string, event: React.DragEvent<HTMLDivElement>) => void;
|
|
@@ -10,4 +10,8 @@ export declare const useKanbanBoardState: ({ columns: initialColumns, onChange,
|
|
|
10
10
|
onCardDragOver: (columnId: string, cardId: string | null, event: React.DragEvent<HTMLDivElement>) => void;
|
|
11
11
|
onColumnDrop: (columnId: string, event: React.DragEvent<HTMLDivElement>) => void;
|
|
12
12
|
onCardDrop: (columnId: string, cardId: string | null, event: React.DragEvent<HTMLDivElement>) => void;
|
|
13
|
+
onCardCreate: (card: KanbanBoardCard, column: KanbanBoardColumn) => void;
|
|
14
|
+
onCardDelete: (card: KanbanBoardCard, column: KanbanBoardColumn) => void;
|
|
15
|
+
onCardTitleChange: (card: KanbanBoardCard, column: KanbanBoardColumn, newTitle: string) => void;
|
|
16
|
+
onCardDescriptionChange: (card: KanbanBoardCard, column: KanbanBoardColumn, newDescription: string) => void;
|
|
13
17
|
};
|
|
@@ -7611,7 +7611,12 @@ var cloneColumns = inputColumns => inputColumns.map(column => Object.assign({},
|
|
|
7611
7611
|
var useKanbanBoardState = _ref => {
|
|
7612
7612
|
var {
|
|
7613
7613
|
columns: initialColumns,
|
|
7614
|
-
onChange
|
|
7614
|
+
onChange,
|
|
7615
|
+
onCardMove,
|
|
7616
|
+
onCardCreate: onCardCreateProp,
|
|
7617
|
+
onCardDelete: onCardDeleteProp,
|
|
7618
|
+
onCardTitleChange: onCardTitleChangeProp,
|
|
7619
|
+
onCardDescriptionChange: onCardDescriptionChangeProp
|
|
7615
7620
|
} = _ref;
|
|
7616
7621
|
var [columns, setColumns] = React.useState(initialColumns);
|
|
7617
7622
|
var [draggedCardId, setDraggedCardId] = React.useState(null);
|
|
@@ -7688,11 +7693,16 @@ var useKanbanBoardState = _ref => {
|
|
|
7688
7693
|
cardId
|
|
7689
7694
|
};
|
|
7690
7695
|
if (options != null && options.shouldCommit) {
|
|
7696
|
+
var originalSourceColumn = prevColumns.find(c => c.id === sourceColumnId);
|
|
7697
|
+
var originalTargetColumn = prevColumns.find(c => c.id === targetColumnId);
|
|
7698
|
+
if (card && originalSourceColumn && originalTargetColumn) {
|
|
7699
|
+
onCardMove == null || onCardMove(card, originalSourceColumn, originalTargetColumn);
|
|
7700
|
+
}
|
|
7691
7701
|
onChange == null || onChange(updatedColumns);
|
|
7692
7702
|
}
|
|
7693
7703
|
return updatedColumns;
|
|
7694
7704
|
});
|
|
7695
|
-
}, [onChange]);
|
|
7705
|
+
}, [onChange, onCardMove]);
|
|
7696
7706
|
var handleCardDragStart = React.useCallback((columnId, cardId, event) => {
|
|
7697
7707
|
dragStateRef.current = {
|
|
7698
7708
|
columnId,
|
|
@@ -7751,6 +7761,62 @@ var useKanbanBoardState = _ref => {
|
|
|
7751
7761
|
shouldCommit: true
|
|
7752
7762
|
});
|
|
7753
7763
|
}, [applyMove, getRelativeDropPosition]);
|
|
7764
|
+
var handleCardCreate = React.useCallback((card, column) => {
|
|
7765
|
+
if (onCardCreateProp) {
|
|
7766
|
+
onCardCreateProp(card, column);
|
|
7767
|
+
return;
|
|
7768
|
+
}
|
|
7769
|
+
setColumns(prevColumns => {
|
|
7770
|
+
var updatedColumns = prevColumns.map(col => col.id === column.id ? Object.assign({}, col, {
|
|
7771
|
+
cards: [...col.cards, card]
|
|
7772
|
+
}) : col);
|
|
7773
|
+
onChange == null || onChange(updatedColumns);
|
|
7774
|
+
return updatedColumns;
|
|
7775
|
+
});
|
|
7776
|
+
}, [onChange, onCardCreateProp]);
|
|
7777
|
+
var handleCardDelete = React.useCallback((card, column) => {
|
|
7778
|
+
if (onCardDeleteProp) {
|
|
7779
|
+
onCardDeleteProp(card, column);
|
|
7780
|
+
return;
|
|
7781
|
+
}
|
|
7782
|
+
setColumns(prevColumns => {
|
|
7783
|
+
var updatedColumns = prevColumns.map(col => col.id === column.id ? Object.assign({}, col, {
|
|
7784
|
+
cards: col.cards.filter(c => c.id !== card.id)
|
|
7785
|
+
}) : col);
|
|
7786
|
+
onChange == null || onChange(updatedColumns);
|
|
7787
|
+
return updatedColumns;
|
|
7788
|
+
});
|
|
7789
|
+
}, [onChange, onCardDeleteProp]);
|
|
7790
|
+
var handleCardTitleChange = React.useCallback((card, column, newTitle) => {
|
|
7791
|
+
if (onCardTitleChangeProp) {
|
|
7792
|
+
onCardTitleChangeProp(card, column, newTitle);
|
|
7793
|
+
return;
|
|
7794
|
+
}
|
|
7795
|
+
setColumns(prevColumns => {
|
|
7796
|
+
var updatedColumns = prevColumns.map(col => col.id === column.id ? Object.assign({}, col, {
|
|
7797
|
+
cards: col.cards.map(c => c.id === card.id ? Object.assign({}, c, {
|
|
7798
|
+
title: newTitle
|
|
7799
|
+
}) : c)
|
|
7800
|
+
}) : col);
|
|
7801
|
+
onChange == null || onChange(updatedColumns);
|
|
7802
|
+
return updatedColumns;
|
|
7803
|
+
});
|
|
7804
|
+
}, [onChange, onCardTitleChangeProp]);
|
|
7805
|
+
var handleCardDescriptionChange = React.useCallback((card, column, newDescription) => {
|
|
7806
|
+
if (onCardDescriptionChangeProp) {
|
|
7807
|
+
onCardDescriptionChangeProp(card, column, newDescription);
|
|
7808
|
+
return;
|
|
7809
|
+
}
|
|
7810
|
+
setColumns(prevColumns => {
|
|
7811
|
+
var updatedColumns = prevColumns.map(col => col.id === column.id ? Object.assign({}, col, {
|
|
7812
|
+
cards: col.cards.map(c => c.id === card.id ? Object.assign({}, c, {
|
|
7813
|
+
description: newDescription
|
|
7814
|
+
}) : c)
|
|
7815
|
+
}) : col);
|
|
7816
|
+
onChange == null || onChange(updatedColumns);
|
|
7817
|
+
return updatedColumns;
|
|
7818
|
+
});
|
|
7819
|
+
}, [onChange, onCardDescriptionChangeProp]);
|
|
7754
7820
|
return {
|
|
7755
7821
|
columns,
|
|
7756
7822
|
draggedCardId,
|
|
@@ -7760,7 +7826,11 @@ var useKanbanBoardState = _ref => {
|
|
|
7760
7826
|
onColumnDragOver: handleColumnDragOver,
|
|
7761
7827
|
onCardDragOver: handleCardDragOver,
|
|
7762
7828
|
onColumnDrop: handleColumnDrop,
|
|
7763
|
-
onCardDrop: handleCardDrop
|
|
7829
|
+
onCardDrop: handleCardDrop,
|
|
7830
|
+
onCardCreate: handleCardCreate,
|
|
7831
|
+
onCardDelete: handleCardDelete,
|
|
7832
|
+
onCardTitleChange: handleCardTitleChange,
|
|
7833
|
+
onCardDescriptionChange: handleCardDescriptionChange
|
|
7764
7834
|
};
|
|
7765
7835
|
};
|
|
7766
7836
|
|
|
@@ -7778,18 +7848,94 @@ var KanbanBoardView = _ref => {
|
|
|
7778
7848
|
onColumnDragOver,
|
|
7779
7849
|
onCardDragOver,
|
|
7780
7850
|
onColumnDrop,
|
|
7781
|
-
onCardDrop
|
|
7851
|
+
onCardDrop,
|
|
7852
|
+
onCardCreate,
|
|
7853
|
+
onCardDelete,
|
|
7854
|
+
onCardTitleChange,
|
|
7855
|
+
onCardDescriptionChange
|
|
7782
7856
|
} = _ref;
|
|
7783
|
-
var
|
|
7857
|
+
var [editingCardId, setEditingCardId] = React__default.useState(null);
|
|
7858
|
+
var [editingDescriptionCardId, setEditingDescriptionCardId] = React__default.useState(null);
|
|
7859
|
+
var [editedTitle, setEditedTitle] = React__default.useState('');
|
|
7860
|
+
var [editedDescription, setEditedDescription] = React__default.useState('');
|
|
7861
|
+
var handleTitleClick = React__default.useCallback(card => {
|
|
7862
|
+
setEditingCardId(card.id);
|
|
7863
|
+
setEditedTitle(card.title);
|
|
7864
|
+
}, []);
|
|
7865
|
+
var handleDescriptionClick = React__default.useCallback(card => {
|
|
7866
|
+
setEditingDescriptionCardId(card.id);
|
|
7867
|
+
setEditedDescription(card.description || '');
|
|
7868
|
+
}, []);
|
|
7869
|
+
var handleTitleChange = React__default.useCallback(event => {
|
|
7870
|
+
setEditedTitle(event.target.value);
|
|
7871
|
+
}, []);
|
|
7872
|
+
var handleDescriptionChange = React__default.useCallback(event => {
|
|
7873
|
+
setEditedDescription(event.target.value);
|
|
7874
|
+
}, []);
|
|
7875
|
+
var handleTitleBlur = React__default.useCallback((card, column) => {
|
|
7876
|
+
if (editingCardId === card.id) {
|
|
7877
|
+
onCardTitleChange == null || onCardTitleChange(card, column, editedTitle);
|
|
7878
|
+
setEditingCardId(null);
|
|
7879
|
+
}
|
|
7880
|
+
}, [editingCardId, editedTitle, onCardTitleChange]);
|
|
7881
|
+
var handleDescriptionBlur = React__default.useCallback((card, column) => {
|
|
7882
|
+
if (editingDescriptionCardId === card.id) {
|
|
7883
|
+
onCardDescriptionChange == null || onCardDescriptionChange(card, column, editedDescription);
|
|
7884
|
+
setEditingDescriptionCardId(null);
|
|
7885
|
+
}
|
|
7886
|
+
}, [editingDescriptionCardId, editedDescription, onCardDescriptionChange]);
|
|
7887
|
+
var handleTitleKeyDown = React__default.useCallback((event, card, column) => {
|
|
7888
|
+
if (event.key === 'Enter') {
|
|
7889
|
+
handleTitleBlur(card, column);
|
|
7890
|
+
}
|
|
7891
|
+
}, [handleTitleBlur]);
|
|
7892
|
+
var handleDescriptionKeyDown = React__default.useCallback((event, card, column) => {
|
|
7893
|
+
if (event.key === 'Enter' && !event.shiftKey) {
|
|
7894
|
+
event.preventDefault();
|
|
7895
|
+
handleDescriptionBlur(card, column);
|
|
7896
|
+
}
|
|
7897
|
+
}, [handleDescriptionBlur]);
|
|
7898
|
+
var renderDefaultCard = React__default.useCallback((card, column) => (/*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
|
|
7784
7899
|
gap: 4,
|
|
7785
7900
|
alignItems: "flex-start"
|
|
7786
|
-
}, views == null ? void 0 : views.cardContent), /*#__PURE__*/React__default.createElement(
|
|
7901
|
+
}, views == null ? void 0 : views.cardContent), editingCardId === card.id ? (/*#__PURE__*/React__default.createElement("input", {
|
|
7902
|
+
type: "text",
|
|
7903
|
+
value: editedTitle,
|
|
7904
|
+
onChange: handleTitleChange,
|
|
7905
|
+
onBlur: () => handleTitleBlur(card, column),
|
|
7906
|
+
onKeyDown: event => handleTitleKeyDown(event, card, column),
|
|
7907
|
+
autoFocus: true,
|
|
7908
|
+
style: {
|
|
7909
|
+
border: '1px solid #d0d5dd',
|
|
7910
|
+
borderRadius: '4px',
|
|
7911
|
+
padding: '4px 8px',
|
|
7912
|
+
fontSize: '14px',
|
|
7913
|
+
fontWeight: '600',
|
|
7914
|
+
width: '100%'
|
|
7915
|
+
}
|
|
7916
|
+
})) : (/*#__PURE__*/React__default.createElement(Text, {
|
|
7787
7917
|
weight: "semiBold",
|
|
7788
|
-
size: "sm"
|
|
7789
|
-
}, card.title), card.description && (/*#__PURE__*/React__default.createElement(Text, {
|
|
7790
7918
|
size: "sm",
|
|
7791
|
-
|
|
7792
|
-
}, card.
|
|
7919
|
+
onClick: () => handleTitleClick(card)
|
|
7920
|
+
}, card.title)), card.description && (editingDescriptionCardId === card.id ? (/*#__PURE__*/React__default.createElement("textarea", {
|
|
7921
|
+
value: editedDescription,
|
|
7922
|
+
onChange: handleDescriptionChange,
|
|
7923
|
+
onBlur: () => handleDescriptionBlur(card, column),
|
|
7924
|
+
onKeyDown: event => handleDescriptionKeyDown(event, card, column),
|
|
7925
|
+
autoFocus: true,
|
|
7926
|
+
style: {
|
|
7927
|
+
border: '1px solid #d0d5dd',
|
|
7928
|
+
borderRadius: '4px',
|
|
7929
|
+
padding: '4px 8px',
|
|
7930
|
+
fontSize: '14px',
|
|
7931
|
+
width: '100%',
|
|
7932
|
+
minHeight: '60px'
|
|
7933
|
+
}
|
|
7934
|
+
})) : (/*#__PURE__*/React__default.createElement(Text, {
|
|
7935
|
+
size: "sm",
|
|
7936
|
+
color: "#475467",
|
|
7937
|
+
onClick: () => handleDescriptionClick(card)
|
|
7938
|
+
}, card.description))))), [views == null ? void 0 : views.cardContent, editingCardId, editedTitle, editingDescriptionCardId, editedDescription, handleTitleBlur, handleTitleChange, handleTitleClick, handleTitleKeyDown, handleDescriptionBlur, handleDescriptionChange, handleDescriptionClick, handleDescriptionKeyDown]);
|
|
7793
7939
|
return /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
|
|
7794
7940
|
display: "flex",
|
|
7795
7941
|
alignItems: "flex-start",
|
|
@@ -7813,27 +7959,21 @@ var KanbanBoardView = _ref => {
|
|
|
7813
7959
|
}, views == null ? void 0 : views.columnHeader), renderColumnHeader ? renderColumnHeader(column) : (/*#__PURE__*/React__default.createElement(Text, Object.assign({
|
|
7814
7960
|
weight: "semiBold",
|
|
7815
7961
|
size: "md"
|
|
7816
|
-
}, views == null ? void 0 : views.columnTitle), column.title))
|
|
7962
|
+
}, views == null ? void 0 : views.columnTitle), column.title)), /*#__PURE__*/React__default.createElement(appStudio.View, {
|
|
7963
|
+
onClick: () => onCardCreate == null ? void 0 : onCardCreate({
|
|
7964
|
+
id: "new-card-" + Date.now(),
|
|
7965
|
+
title: 'Nouvelle carte'
|
|
7966
|
+
}, column)
|
|
7967
|
+
}, /*#__PURE__*/React__default.createElement(PlusIcon, {
|
|
7968
|
+
widthHeight: 16
|
|
7969
|
+
}))), /*#__PURE__*/React__default.createElement(appStudio.Vertical, Object.assign({
|
|
7817
7970
|
gap: 12,
|
|
7818
7971
|
minHeight: 40,
|
|
7819
7972
|
onDragOver: event => onColumnDragOver(column.id, event),
|
|
7820
7973
|
onDrop: event => onColumnDrop(column.id, event),
|
|
7821
7974
|
opacity: draggedCardId && hoveredColumnId === column.id ? 0.9 : undefined,
|
|
7822
7975
|
transition: "all 0.15s ease-in-out"
|
|
7823
|
-
}, views == null ? void 0 : views.columnBody), column.cards.
|
|
7824
|
-
padding: 12,
|
|
7825
|
-
borderWidth: "1px",
|
|
7826
|
-
borderStyle: "dashed",
|
|
7827
|
-
borderColor: "#d0d5dd",
|
|
7828
|
-
borderRadius: 8,
|
|
7829
|
-
backgroundColor: "rgba(255, 255, 255, 0.6)",
|
|
7830
|
-
textAlign: "center",
|
|
7831
|
-
color: "#667085",
|
|
7832
|
-
fontSize: "14px"
|
|
7833
|
-
}, views == null ? void 0 : views.emptyState), renderEmptyState ? renderEmptyState(column) : (/*#__PURE__*/React__default.createElement(Text, {
|
|
7834
|
-
size: "sm",
|
|
7835
|
-
color: "#667085"
|
|
7836
|
-
}, "Drop cards here")))), column.cards.map(card => (/*#__PURE__*/React__default.createElement(appStudio.View, {
|
|
7976
|
+
}, views == null ? void 0 : views.columnBody), column.cards.map(card => (/*#__PURE__*/React__default.createElement(appStudio.View, {
|
|
7837
7977
|
key: card.id,
|
|
7838
7978
|
position: "relative"
|
|
7839
7979
|
}, /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
|
|
@@ -7853,7 +7993,35 @@ var KanbanBoardView = _ref => {
|
|
|
7853
7993
|
event.stopPropagation();
|
|
7854
7994
|
onCardDrop(column.id, card.id, event);
|
|
7855
7995
|
}
|
|
7856
|
-
}, views == null ? void 0 : views.card),
|
|
7996
|
+
}, views == null ? void 0 : views.card), /*#__PURE__*/React__default.createElement(appStudio.View, {
|
|
7997
|
+
display: "flex",
|
|
7998
|
+
justifyContent: "space-between",
|
|
7999
|
+
alignItems: "flex-start"
|
|
8000
|
+
}, /*#__PURE__*/React__default.createElement(appStudio.View, {
|
|
8001
|
+
flexGrow: 1
|
|
8002
|
+
}, renderCard ? renderCard(card, column) : renderDefaultCard(card, column)), /*#__PURE__*/React__default.createElement(appStudio.View, {
|
|
8003
|
+
onClick: () => onCardDelete == null ? void 0 : onCardDelete(card, column)
|
|
8004
|
+
}, /*#__PURE__*/React__default.createElement(TrashIcon, {
|
|
8005
|
+
widthHeight: 16
|
|
8006
|
+
}))))))), /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
|
|
8007
|
+
padding: 12,
|
|
8008
|
+
borderWidth: "1px",
|
|
8009
|
+
borderStyle: "dashed",
|
|
8010
|
+
borderColor: "#d0d5dd",
|
|
8011
|
+
borderRadius: 8,
|
|
8012
|
+
backgroundColor: "rgba(255, 255, 255, 0.6)",
|
|
8013
|
+
textAlign: "center",
|
|
8014
|
+
color: "#667085",
|
|
8015
|
+
fontSize: "14px"
|
|
8016
|
+
}, views == null ? void 0 : views.emptyState, {
|
|
8017
|
+
onClick: () => onCardCreate == null ? void 0 : onCardCreate({
|
|
8018
|
+
id: "new-card-" + Date.now(),
|
|
8019
|
+
title: 'Nouvelle carte'
|
|
8020
|
+
}, column)
|
|
8021
|
+
}), renderEmptyState ? renderEmptyState(column) : (/*#__PURE__*/React__default.createElement(Text, {
|
|
8022
|
+
size: "sm",
|
|
8023
|
+
color: "#667085"
|
|
8024
|
+
}, "Create a new card")))), column.footer && (/*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({}, views == null ? void 0 : views.columnFooter), column.footer))))));
|
|
7857
8025
|
};
|
|
7858
8026
|
|
|
7859
8027
|
var KanbanBoardComponent = props => {
|
|
@@ -8280,11 +8448,111 @@ var iconButtonStyles = {
|
|
|
8280
8448
|
border: 'none'
|
|
8281
8449
|
};
|
|
8282
8450
|
|
|
8283
|
-
var
|
|
8451
|
+
var EventContent = _ref => {
|
|
8452
|
+
var {
|
|
8453
|
+
event,
|
|
8454
|
+
onTitleChange,
|
|
8455
|
+
onDescriptionChange,
|
|
8456
|
+
onEventDelete
|
|
8457
|
+
} = _ref;
|
|
8458
|
+
var [isEditingTitle, setIsEditingTitle] = React.useState(false);
|
|
8459
|
+
var [editedTitle, setEditedTitle] = React.useState(event.title);
|
|
8460
|
+
var [isEditingDescription, setIsEditingDescription] = React.useState(false);
|
|
8461
|
+
var [editedDescription, setEditedDescription] = React.useState(event.description || '');
|
|
8462
|
+
var handleTitleClick = React.useCallback(() => {
|
|
8463
|
+
setIsEditingTitle(true);
|
|
8464
|
+
setEditedTitle(event.title);
|
|
8465
|
+
}, [event.title]);
|
|
8466
|
+
var handleDescriptionClick = React.useCallback(() => {
|
|
8467
|
+
setIsEditingDescription(true);
|
|
8468
|
+
setEditedDescription(event.description || '');
|
|
8469
|
+
}, [event.description]);
|
|
8470
|
+
var handleTitleChange = React.useCallback(e => {
|
|
8471
|
+
setEditedTitle(e.target.value);
|
|
8472
|
+
}, []);
|
|
8473
|
+
var handleDescriptionChange = React.useCallback(e => {
|
|
8474
|
+
setEditedDescription(e.target.value);
|
|
8475
|
+
}, []);
|
|
8476
|
+
var handleTitleBlur = React.useCallback(() => {
|
|
8477
|
+
if (isEditingTitle) {
|
|
8478
|
+
onTitleChange(event, editedTitle);
|
|
8479
|
+
setIsEditingTitle(false);
|
|
8480
|
+
}
|
|
8481
|
+
}, [isEditingTitle, onTitleChange, event, editedTitle]);
|
|
8482
|
+
var handleDescriptionBlur = React.useCallback(() => {
|
|
8483
|
+
if (isEditingDescription) {
|
|
8484
|
+
onDescriptionChange(event, editedDescription);
|
|
8485
|
+
setIsEditingDescription(false);
|
|
8486
|
+
}
|
|
8487
|
+
}, [isEditingDescription, onDescriptionChange, event, editedDescription]);
|
|
8488
|
+
var handleTitleKeyDown = React.useCallback(e => {
|
|
8489
|
+
if (e.key === 'Enter') {
|
|
8490
|
+
handleTitleBlur();
|
|
8491
|
+
}
|
|
8492
|
+
}, [handleTitleBlur]);
|
|
8493
|
+
var handleDescriptionKeyDown = React.useCallback(e => {
|
|
8494
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
8495
|
+
e.preventDefault();
|
|
8496
|
+
handleDescriptionBlur();
|
|
8497
|
+
}
|
|
8498
|
+
}, [handleDescriptionBlur]);
|
|
8499
|
+
return /*#__PURE__*/React__default.createElement(appStudio.Horizontal, {
|
|
8500
|
+
overflow: "hidden",
|
|
8501
|
+
textOverflow: "ellipsis",
|
|
8502
|
+
whiteSpace: "nowrap",
|
|
8503
|
+
width: "100%",
|
|
8504
|
+
justifyContent: "space-between"
|
|
8505
|
+
}, isEditingTitle ? (/*#__PURE__*/React__default.createElement("input", {
|
|
8506
|
+
type: "text",
|
|
8507
|
+
value: editedTitle,
|
|
8508
|
+
onChange: handleTitleChange,
|
|
8509
|
+
onBlur: handleTitleBlur,
|
|
8510
|
+
onKeyDown: handleTitleKeyDown,
|
|
8511
|
+
autoFocus: true,
|
|
8512
|
+
style: {
|
|
8513
|
+
border: '1px solid #d0d5dd',
|
|
8514
|
+
borderRadius: '4px',
|
|
8515
|
+
padding: '2px 4px',
|
|
8516
|
+
fontSize: '11px',
|
|
8517
|
+
fontWeight: '500',
|
|
8518
|
+
width: '100%'
|
|
8519
|
+
}
|
|
8520
|
+
})) : (/*#__PURE__*/React__default.createElement(appStudio.Text, {
|
|
8521
|
+
fontSize: 11,
|
|
8522
|
+
fontWeight: 500,
|
|
8523
|
+
onClick: handleTitleClick
|
|
8524
|
+
}, event.title)), event.description && (isEditingDescription ? (/*#__PURE__*/React__default.createElement("textarea", {
|
|
8525
|
+
value: editedDescription,
|
|
8526
|
+
onChange: handleDescriptionChange,
|
|
8527
|
+
onBlur: handleDescriptionBlur,
|
|
8528
|
+
onKeyDown: handleDescriptionKeyDown,
|
|
8529
|
+
autoFocus: true,
|
|
8530
|
+
style: {
|
|
8531
|
+
border: '1px solid #d0d5dd',
|
|
8532
|
+
borderRadius: '4px',
|
|
8533
|
+
padding: '2px 4px',
|
|
8534
|
+
fontSize: '11px',
|
|
8535
|
+
width: '100%',
|
|
8536
|
+
minHeight: '40px',
|
|
8537
|
+
marginTop: '4px'
|
|
8538
|
+
}
|
|
8539
|
+
})) : (/*#__PURE__*/React__default.createElement(appStudio.Text, {
|
|
8540
|
+
fontSize: 11,
|
|
8541
|
+
color: "color.gray.600",
|
|
8542
|
+
onClick: handleDescriptionClick
|
|
8543
|
+
}, event.description))), /*#__PURE__*/React__default.createElement(appStudio.Center, {
|
|
8544
|
+
onClick: () => onEventDelete(event),
|
|
8545
|
+
cursor: "pointer",
|
|
8546
|
+
marginLeft: 4
|
|
8547
|
+
}, /*#__PURE__*/React__default.createElement(TrashIcon, {
|
|
8548
|
+
widthHeight: 12
|
|
8549
|
+
})));
|
|
8550
|
+
};
|
|
8551
|
+
var ResizeHandle = _ref2 => {
|
|
8284
8552
|
var {
|
|
8285
8553
|
direction,
|
|
8286
8554
|
onMouseDown
|
|
8287
|
-
} =
|
|
8555
|
+
} = _ref2;
|
|
8288
8556
|
var [isHovered, setIsHovered] = React.useState(false);
|
|
8289
8557
|
return /*#__PURE__*/React__default.createElement(appStudio.View, Object.assign({
|
|
8290
8558
|
position: "absolute",
|
|
@@ -8309,7 +8577,7 @@ var ResizeHandle = _ref => {
|
|
|
8309
8577
|
var MONTH_EVENT_ROW_HEIGHT = 22;
|
|
8310
8578
|
var MONTH_EVENT_ROW_GAP = 4;
|
|
8311
8579
|
var MONTH_EVENT_TOP_OFFSET = 32;
|
|
8312
|
-
var Calendar =
|
|
8580
|
+
var Calendar = _ref3 => {
|
|
8313
8581
|
var {
|
|
8314
8582
|
initialDate = new Date(),
|
|
8315
8583
|
initialView = 'month',
|
|
@@ -8321,11 +8589,14 @@ var Calendar = _ref2 => {
|
|
|
8321
8589
|
onDateChange,
|
|
8322
8590
|
onViewChange,
|
|
8323
8591
|
onEventAdd,
|
|
8592
|
+
onEventTitleChange,
|
|
8593
|
+
onEventDescriptionChange,
|
|
8594
|
+
onEventDelete,
|
|
8324
8595
|
views = {},
|
|
8325
8596
|
width = '100%',
|
|
8326
8597
|
maxWidth = 1200,
|
|
8327
8598
|
weekStartsOn = 0
|
|
8328
|
-
} =
|
|
8599
|
+
} = _ref3;
|
|
8329
8600
|
var {
|
|
8330
8601
|
getColor
|
|
8331
8602
|
} = appStudio.useTheme();
|
|
@@ -8352,6 +8623,31 @@ var Calendar = _ref2 => {
|
|
|
8352
8623
|
React__default.useEffect(() => {
|
|
8353
8624
|
setLocalEvents(events);
|
|
8354
8625
|
}, [events]);
|
|
8626
|
+
var handleEventTitleChange = React.useCallback((event, newTitle) => {
|
|
8627
|
+
if (onEventTitleChange) {
|
|
8628
|
+
onEventTitleChange(event, newTitle);
|
|
8629
|
+
return;
|
|
8630
|
+
}
|
|
8631
|
+
setLocalEvents(prevEvents => prevEvents.map(ev => ev.id === event.id ? Object.assign({}, ev, {
|
|
8632
|
+
title: newTitle
|
|
8633
|
+
}) : ev));
|
|
8634
|
+
}, [onEventTitleChange]);
|
|
8635
|
+
var handleEventDescriptionChange = React.useCallback((event, newDescription) => {
|
|
8636
|
+
if (onEventDescriptionChange) {
|
|
8637
|
+
onEventDescriptionChange(event, newDescription);
|
|
8638
|
+
return;
|
|
8639
|
+
}
|
|
8640
|
+
setLocalEvents(prevEvents => prevEvents.map(ev => ev.id === event.id ? Object.assign({}, ev, {
|
|
8641
|
+
description: newDescription
|
|
8642
|
+
}) : ev));
|
|
8643
|
+
}, [onEventDescriptionChange]);
|
|
8644
|
+
var handleEventDelete = React.useCallback(event => {
|
|
8645
|
+
if (onEventDelete) {
|
|
8646
|
+
onEventDelete(event);
|
|
8647
|
+
return;
|
|
8648
|
+
}
|
|
8649
|
+
setLocalEvents(prevEvents => prevEvents.filter(ev => ev.id !== event.id));
|
|
8650
|
+
}, [onEventDelete]);
|
|
8355
8651
|
// Get the month start for current date
|
|
8356
8652
|
var currentMonth = React.useMemo(() => getFirstDayOfMonth(currentDate), [currentDate]);
|
|
8357
8653
|
// Generate calendar dates based on view
|
|
@@ -8712,12 +9008,12 @@ var Calendar = _ref2 => {
|
|
|
8712
9008
|
top: event.segmentRow * (MONTH_EVENT_ROW_HEIGHT + MONTH_EVENT_ROW_GAP) + "px",
|
|
8713
9009
|
onMouseDown: e => handleEventMouseDown(e, event),
|
|
8714
9010
|
title: event.title
|
|
8715
|
-
}, views.event), /*#__PURE__*/React__default.createElement(
|
|
8716
|
-
|
|
8717
|
-
|
|
8718
|
-
|
|
8719
|
-
|
|
8720
|
-
}
|
|
9011
|
+
}, views.event), /*#__PURE__*/React__default.createElement(EventContent, {
|
|
9012
|
+
event: event,
|
|
9013
|
+
onTitleChange: handleEventTitleChange,
|
|
9014
|
+
onDescriptionChange: handleEventDescriptionChange,
|
|
9015
|
+
onEventDelete: handleEventDelete
|
|
9016
|
+
}), showLeftHandle && (/*#__PURE__*/React__default.createElement(ResizeHandle, {
|
|
8721
9017
|
direction: "left",
|
|
8722
9018
|
onMouseDown: e => handleResizeStart(e, event, 'left')
|
|
8723
9019
|
})), showRightHandle && (/*#__PURE__*/React__default.createElement(ResizeHandle, {
|
|
@@ -8778,12 +9074,12 @@ var Calendar = _ref2 => {
|
|
|
8778
9074
|
userSelect: "none",
|
|
8779
9075
|
onMouseDown: e => handleEventMouseDown(e, event),
|
|
8780
9076
|
title: event.title
|
|
8781
|
-
}, views.event), /*#__PURE__*/React__default.createElement(
|
|
8782
|
-
|
|
8783
|
-
|
|
8784
|
-
|
|
8785
|
-
|
|
8786
|
-
}
|
|
9077
|
+
}, views.event), /*#__PURE__*/React__default.createElement(EventContent, {
|
|
9078
|
+
event: event,
|
|
9079
|
+
onTitleChange: handleEventTitleChange,
|
|
9080
|
+
onDescriptionChange: handleEventDescriptionChange,
|
|
9081
|
+
onEventDelete: handleEventDelete
|
|
9082
|
+
}), /*#__PURE__*/React__default.createElement(ResizeHandle, {
|
|
8787
9083
|
direction: "left",
|
|
8788
9084
|
onMouseDown: e => handleResizeStart(e, event, 'left')
|
|
8789
9085
|
}), /*#__PURE__*/React__default.createElement(ResizeHandle, {
|
|
@@ -8830,7 +9126,7 @@ var Calendar = _ref2 => {
|
|
|
8830
9126
|
}, views.timeSlot), dayEvents.filter(event => {
|
|
8831
9127
|
// Simple check if event starts in this hour
|
|
8832
9128
|
if (event.start.includes('T')) {
|
|
8833
|
-
var eventHour = parseInt(event.start.split('T')
|
|
9129
|
+
var eventHour = parseInt(event.start.split('T').split(':'));
|
|
8834
9130
|
return eventHour === hour;
|
|
8835
9131
|
}
|
|
8836
9132
|
return false;
|
|
@@ -8843,7 +9139,12 @@ var Calendar = _ref2 => {
|
|
|
8843
9139
|
borderLeftColor: colorConfig.border,
|
|
8844
9140
|
color: colorConfig.text,
|
|
8845
9141
|
marginBottom: 4
|
|
8846
|
-
}, views.event),
|
|
9142
|
+
}, views.event), /*#__PURE__*/React__default.createElement(EventContent, {
|
|
9143
|
+
event: event,
|
|
9144
|
+
onTitleChange: handleEventTitleChange,
|
|
9145
|
+
onDescriptionChange: handleEventDescriptionChange,
|
|
9146
|
+
onEventDelete: handleEventDelete
|
|
9147
|
+
}));
|
|
8847
9148
|
})));
|
|
8848
9149
|
}));
|
|
8849
9150
|
};
|