Skip to content

Commit 85fc3cd

Browse files
committed
feat: lock issue
1 parent 55d7368 commit 85fc3cd

File tree

2 files changed

+70
-12
lines changed

2 files changed

+70
-12
lines changed

apps/client/components/Combo/index.tsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export function UserCombo({
3333
defaultName,
3434
hideInitial,
3535
showIcon,
36+
disabled,
3637
}) {
3738
const [open, setOpen] = React.useState(false);
3839
const [selectedStatus, setSelectedStatus] = React.useState<any | null>(null);
@@ -45,6 +46,7 @@ export function UserCombo({
4546
variant="outline"
4647
size="sm"
4748
className="w-[180px] justify-start border-none"
49+
disabled={disabled}
4850
>
4951
{selectedStatus ? (
5052
<div className="flex flex-row space-x-2 w-[120px]">
@@ -117,11 +119,19 @@ export function UserCombo({
117119
);
118120
}
119121

120-
export function IconCombo({ value, update, defaultName, hideInitial }) {
122+
export function IconCombo({
123+
value,
124+
update,
125+
defaultName,
126+
hideInitial,
127+
disabled,
128+
}) {
121129
const [open, setOpen] = React.useState(false);
122130
const [selectedStatus, setSelectedStatus] = React.useState<any | null>(null);
123131
const defaultIcon = value.find((k) => k.value === defaultName);
124132

133+
console.log(disabled);
134+
125135
return (
126136
<div className="flex items-center space-x-4">
127137
<Popover open={open} onOpenChange={setOpen}>
@@ -130,16 +140,17 @@ export function IconCombo({ value, update, defaultName, hideInitial }) {
130140
variant="outline"
131141
size="sm"
132142
className="w-[180px] justify-start border-none"
143+
disabled={disabled}
133144
>
134145
{selectedStatus ? (
135146
<div className="flex flex-row space-x-2 w-[120px]">
136147
{!hideInitial && (
137148
<div className="flex-shrink-0">
138-
<span className="inline-flex h-6 w-6 pl-2.5 items-center justify-center ">
139-
<span className="text-xs font-medium leading-none text-foreground uppercase ">
140-
<selectedStatus.icon className="mr-2 h-4 w-4 shrink-0" />
149+
<span className="inline-flex h-6 w-6 pl-2.5 items-center justify-center ">
150+
<span className="text-xs font-medium leading-none text-foreground uppercase ">
151+
<selectedStatus.icon className="mr-2 h-4 w-4 shrink-0" />
152+
</span>
141153
</span>
142-
</span>
143154
</div>
144155
)}
145156
<span className="mt-[2.5px] capitalize">
@@ -151,7 +162,9 @@ export function IconCombo({ value, update, defaultName, hideInitial }) {
151162
<div className="flex-shrink-0">
152163
<span className="inline-flex h-6 w-6 pl-2.5 items-center justify-center ">
153164
<span className="text-xs font-medium leading-none text-foreground uppercase ">
154-
{defaultIcon && <defaultIcon.icon className="mr-2 h-4 w-4 shrink-0" />}
165+
{defaultIcon && (
166+
<defaultIcon.icon className="mr-2 h-4 w-4 shrink-0" />
167+
)}
155168
</span>
156169
</span>
157170
</div>

apps/client/components/TicketDetails/index.tsx

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ export default function Ticket() {
134134
const { id } = history.query;
135135

136136
async function update() {
137+
if (data && data.ticket && data.ticket.locked) return;
138+
137139
await fetch(`/api/v1/ticket/update`, {
138140
method: "PUT",
139141
headers: {
@@ -157,6 +159,8 @@ export default function Ticket() {
157159
}
158160

159161
async function updateStatus() {
162+
if (data && data.ticket && data.ticket.locked) return;
163+
160164
await fetch(`/api/v1/ticket/status/update`, {
161165
method: "PUT",
162166
headers: {
@@ -173,6 +177,8 @@ export default function Ticket() {
173177
}
174178

175179
async function hide(hidden) {
180+
if (data && data.ticket && data.ticket.locked) return;
181+
176182
await fetch(`/api/v1/ticket/status/hide`, {
177183
method: "PUT",
178184
headers: {
@@ -229,6 +235,8 @@ export default function Ticket() {
229235
}
230236

231237
async function addComment() {
238+
if (data && data.ticket && data.ticket.locked) return;
239+
232240
await fetch(`/api/v1/ticket/comment`, {
233241
method: "POST",
234242
headers: {
@@ -246,6 +254,8 @@ export default function Ticket() {
246254
}
247255

248256
async function addTime() {
257+
if (data && data.ticket && data.ticket.locked) return;
258+
249259
await fetch(`/api/v1/time/new`, {
250260
method: "POST",
251261
headers: {
@@ -290,6 +300,8 @@ export default function Ticket() {
290300
}
291301

292302
async function transferTicket() {
303+
if (data && data.ticket && data.ticket.locked) return;
304+
293305
if (n !== undefined) {
294306
await fetch(`/api/v1/ticket/transfer`, {
295307
method: "POST",
@@ -426,6 +438,7 @@ export default function Ticket() {
426438
}
427439

428440
const handleInputChange = (editor) => {
441+
if (data.ticket.locked) return;
429442
setIssue(editor.document);
430443
};
431444

@@ -465,6 +478,7 @@ export default function Ticket() {
465478
defaultValue={data.ticket.title}
466479
onChange={(e) => setTitle(e.target.value)}
467480
key={data.ticket.id}
481+
disabled={data.ticket.locked}
468482
/>
469483
</div>
470484
<div className="mt-2 text-xs flex flex-row justify-between items-center space-x-1 text-gray-500 dark:text-white">
@@ -584,6 +598,7 @@ export default function Ticket() {
584598
? data.ticket.assignedTo.name
585599
: ""
586600
}
601+
disabled={data.ticket.locked}
587602
/>
588603
)}
589604
</div>
@@ -594,6 +609,7 @@ export default function Ticket() {
594609
defaultName={
595610
data.ticket.priority ? data.ticket.priority : ""
596611
}
612+
disabled={data.ticket.locked}
597613
/>
598614

599615
<IconCombo
@@ -602,6 +618,7 @@ export default function Ticket() {
602618
defaultName={
603619
data.ticket.status ? data.ticket.status : ""
604620
}
621+
disabled={data.ticket.locked}
605622
/>
606623
</div>
607624
</div>
@@ -662,6 +679,7 @@ export default function Ticket() {
662679
sideMenu={false}
663680
className="m-0 p-0 bg-transparent dark:text-white"
664681
onChange={handleInputChange}
682+
editable={!data.ticket.locked}
665683
/>
666684
</>
667685
) : (
@@ -773,9 +791,14 @@ export default function Ticket() {
773791
name="comment"
774792
rows={3}
775793
className="block w-full bg-transparent rounded-md border-0 py-1.5 shadow-sm ring-1 ring-inset ring-background focus:ring-0 focus:ring-inset focus:ring-gray-900 sm:text-sm sm:leading-6"
776-
placeholder="Leave a comment"
794+
placeholder={
795+
data.ticket.locked
796+
? "This ticket is locked"
797+
: "Leave a comment"
798+
}
777799
defaultValue={""}
778800
onChange={(e) => setComment(e.target.value)}
801+
disabled={data.ticket.locked}
779802
/>
780803
</div>
781804
<div className="mt-4 flex justify-end">
@@ -811,8 +834,15 @@ export default function Ticket() {
811834
{data.ticket.isComplete ? (
812835
<button
813836
type="button"
814-
onClick={() => updateStatus()}
815-
className="inline-flex justify-center items-center gap-x-1.5 rounded-md bg-white px-3 py-1.5 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50"
837+
onClick={() => {
838+
if (!data.ticket.locked) {
839+
updateStatus();
840+
}
841+
}}
842+
disabled={data.ticket.locked}
843+
className={`inline-flex justify-center items-center gap-x-1.5 rounded-md ${
844+
data.ticket.locked ? "bg-gray-300 cursor-not-allowed" : "bg-white hover:bg-gray-50"
845+
} px-3 py-1.5 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300`}
816846
>
817847
<CheckCircleIcon
818848
className="-ml-0.5 h-5 w-5 text-red-500"
@@ -825,8 +855,15 @@ export default function Ticket() {
825855
) : (
826856
<button
827857
type="button"
828-
onClick={() => updateStatus()}
829-
className="inline-flex justify-center gap-x-1.5 rounded-md bg-white px-3 py-1.5 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50"
858+
onClick={() => {
859+
if (!data.ticket.locked) {
860+
updateStatus();
861+
}
862+
}}
863+
disabled={data.ticket.locked}
864+
className={`inline-flex justify-center gap-x-1.5 rounded-md ${
865+
data.ticket.locked ? "bg-gray-300 cursor-not-allowed" : "bg-white hover:bg-gray-50"
866+
} px-3 py-1.5 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300`}
830867
>
831868
<CheckCircleIcon
832869
className="-ml-0.5 h-5 w-5 text-green-500"
@@ -838,7 +875,12 @@ export default function Ticket() {
838875
<button
839876
onClick={() => addComment()}
840877
type="submit"
841-
className="inline-flex items-center justify-center rounded-md bg-gray-900 px-4 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-gray-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900"
878+
disabled={data.ticket.locked}
879+
className={`inline-flex items-center justify-center rounded-md px-4 py-1.5 text-sm font-semibold text-white shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-900 ${
880+
data.ticket.locked
881+
? "bg-gray-400 cursor-not-allowed"
882+
: "bg-gray-900 hover:bg-gray-700"
883+
}`}
842884
>
843885
{t("comment")}
844886
</button>
@@ -862,19 +904,22 @@ export default function Ticket() {
862904
defaultName={
863905
data.ticket.assignedTo ? data.ticket.assignedTo.name : ""
864906
}
907+
disabled={data.ticket.locked}
865908
/>
866909
)}
867910

868911
<IconCombo
869912
value={priorityOptions}
870913
update={setPriority}
871914
defaultName={data.ticket.priority ? data.ticket.priority : ""}
915+
disabled={data.ticket.locked}
872916
/>
873917

874918
<IconCombo
875919
value={ticketStatusMap}
876920
update={setTicketStatus}
877921
defaultName={data.ticket.status ? data.ticket.status : ""}
922+
disabled={data.ticket.locked}
878923
/>
879924

880925
{/* <div className="border-t border-gray-200">

0 commit comments

Comments
 (0)