Skip to content

Commit 763fa13

Browse files
authored
Merge pull request #7359 from ProcessMaker/feature/FOUR-19004-A
FOUR-19004: Create a NEW VIEW for cases Part Counters
2 parents f8941cd + 90d1ab5 commit 763fa13

40 files changed

+1418
-1
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace ProcessMaker\Http\Controllers;
4+
5+
use Facades\ProcessMaker\RollbackProcessRequest;
6+
use Illuminate\Http\Request;
7+
use Illuminate\Support\Facades\Auth;
8+
use Illuminate\Support\Facades\Route;
9+
use ProcessMaker\Cache\CacheRemember;
10+
use ProcessMaker\Events\FilesDownloaded;
11+
use ProcessMaker\Events\ScreenBuilderStarting;
12+
use ProcessMaker\Filters\SaveSession;
13+
use ProcessMaker\Helpers\DefaultColumns;
14+
use ProcessMaker\Helpers\MobileHelper;
15+
use ProcessMaker\Http\Controllers\Controller;
16+
use ProcessMaker\Managers\DataManager;
17+
use ProcessMaker\Managers\ScreenBuilderManager;
18+
use ProcessMaker\Models\Comment;
19+
use ProcessMaker\Models\Process;
20+
use ProcessMaker\Models\ProcessRequest;
21+
use ProcessMaker\Models\ProcessRequestToken;
22+
use ProcessMaker\Models\Screen;
23+
use ProcessMaker\Models\ScreenVersion;
24+
use ProcessMaker\Models\UserResourceView;
25+
use ProcessMaker\Package\PackageComments\PackageServiceProvider;
26+
use ProcessMaker\ProcessTranslations\ProcessTranslation;
27+
use ProcessMaker\RetryProcessRequest;
28+
use ProcessMaker\Traits\HasControllerAddons;
29+
use ProcessMaker\Traits\SearchAutocompleteTrait;
30+
use Spatie\MediaLibrary\MediaCollections\Models\Media;
31+
32+
class CasesController extends Controller
33+
{
34+
/**
35+
* Get the list of requests.
36+
*
37+
* @return \Illuminate\View\View|\Illuminate\Contracts\View
38+
*/
39+
public function index($type = null)
40+
{
41+
// This is a temporary API the engine team will provide the new
42+
return view('cases.casesMain');
43+
}
44+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<template>
2+
<button
3+
type="button"
4+
:class="`tw-flex tw-rounded-lg tw-border tw-border-${color}-300 tw-text-${color}-500
5+
tw-space-x-2 tw-px-3 tw-py-3 hover:tw-bg-${color}-200 tw-justify-center tw-items-center`"
6+
@click="onClick"
7+
>
8+
<slot />
9+
</button>
10+
</template>
11+
12+
<script>
13+
import { defineComponent } from "vue";
14+
15+
export default defineComponent({
16+
props: {
17+
color: {
18+
type: String,
19+
default: () => "gray",
20+
},
21+
},
22+
emits: ["click"],
23+
setup(props, { emit }) {
24+
const onClick = () => {
25+
emit("click");
26+
};
27+
return {
28+
onClick,
29+
};
30+
},
31+
});
32+
</script>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import OutlineButton from "./OutlineButton.vue";
2+
3+
export { OutlineButton };
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<template>
2+
<div
3+
class="tw-flex tw-justify-between tw-items-center
4+
tw-p-4 tw-transition tw-duration-150 tw-ease-out
5+
hover:tw-ease-in tw-border tw-cursor-pointer tw-rounded-lg tw-text-gray-600"
6+
:class="[{
7+
[`tw-bg-${color}-100/50 hover:tw-bg-${color}-100`]:!active,
8+
[`tw-outline tw-bg-${color}-100 tw-border-${color}-500 tw-outline-${color}-300 tw-bg-${color}-100 hover:tw-bg-${color}-200`]:active
9+
}]"
10+
@click="handleClick"
11+
>
12+
<div>
13+
<slot name="header">
14+
<div class="tw-text-xs">
15+
{{ header }}
16+
</div>
17+
</slot>
18+
<slot name="body">
19+
<div class="tw-text-2xl">
20+
{{ body }}
21+
</div>
22+
</slot>
23+
</div>
24+
25+
<slot name="icon">
26+
<i
27+
:class="[`tw-text-${color}-500 tw-text-3xl`, icon]"
28+
/>
29+
</slot>
30+
</div>
31+
</template>
32+
33+
<script>
34+
import { defineComponent } from "vue";
35+
36+
export default defineComponent({
37+
props: {
38+
header: {
39+
type: String,
40+
default: () => "header",
41+
},
42+
body: {
43+
type: String,
44+
default: () => "body",
45+
},
46+
icon: {
47+
type: String,
48+
default: () => "",
49+
},
50+
active: {
51+
type: Boolean,
52+
default: () => false,
53+
},
54+
color: {
55+
type: String,
56+
default: () => "gray",
57+
},
58+
},
59+
setup(props, { emit }) {
60+
const handleClick = () => {
61+
emit("click");
62+
};
63+
return {
64+
handleClick,
65+
};
66+
},
67+
});
68+
</script>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import ThreeSectionCard from "./ThreeSectionCard.vue";
2+
3+
export { ThreeSectionCard };
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
<template>
2+
<div class="t-relative">
3+
<slot
4+
v-bind="{
5+
toogleShow,
6+
data,
7+
}"
8+
name="input">
9+
<button
10+
@click.prevent.stop="show = !show"
11+
class="t-flex t-w-full t-justify-between t-items-center t-py-2 t-px-3 t-ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-primary-400">
12+
<span>{{ data?.label || data?.value || "" }} </span>
13+
14+
<i class="fas fa-chevron-down" />
15+
</button>
16+
</slot>
17+
18+
<transition :name="animation">
19+
<div
20+
v-if="show"
21+
:class="'bg-' + color + '-500'"
22+
class="block mt-1 rounded absolute z-10 shadow-lg w-full bg-white">
23+
<ul class="list-none overflow-hidden rounded">
24+
<li
25+
v-for="(option, index) in optionsModel"
26+
:key="index"
27+
class="hover:bg-gray-200"
28+
:class="{
29+
'bg-gray-300': option?.value === data?.value,
30+
}"
31+
@click.prevent.stop="onClick(option, index)">
32+
<slot
33+
name="option"
34+
v-bind="{
35+
option,
36+
}">
37+
<span
38+
class="flex py-2 px-4 transition duration-300"
39+
:class="'theme-' + color"
40+
>{{ option.label || option.value }}</span
41+
>
42+
</slot>
43+
</li>
44+
</ul>
45+
</div>
46+
</transition>
47+
</div>
48+
</template>
49+
50+
<script>
51+
import {
52+
defineComponent,
53+
ref,
54+
computed,
55+
onMounted,
56+
onUnmounted,
57+
} from "vue";
58+
59+
export default defineComponent({
60+
props: {
61+
color: {
62+
type: String,
63+
default: () => "blue",
64+
},
65+
animation: {
66+
type: String,
67+
default: () => "fade",
68+
},
69+
// Example input options {"label":"Label 1" , "value": "1"}
70+
options: {
71+
type: Array,
72+
default: () => [],
73+
},
74+
modelValue: {
75+
type: Object,
76+
default: () => null,
77+
},
78+
},
79+
emits: ["update:modelValue", "change"],
80+
setup(props, { emit }) {
81+
const show = ref(false);
82+
const count = ref(0);
83+
84+
const data = computed({
85+
get() {
86+
return props.modelValue;
87+
},
88+
set(value) {
89+
emit("update:modelValue", value);
90+
},
91+
});
92+
93+
const optionsModel = computed({
94+
get() {
95+
return props.options;
96+
},
97+
set(val) {
98+
emit("update:options", val);
99+
},
100+
});
101+
102+
const onClick = (option, index) => {
103+
show.value = false;
104+
data.value = option;
105+
106+
emit("change", option);
107+
};
108+
109+
const addBodyListener = () => {
110+
show.value = false;
111+
};
112+
113+
const toogleShow = () => {
114+
show.value = !show.value;
115+
};
116+
117+
onMounted(() => {
118+
document.body.addEventListener("click", addBodyListener);
119+
});
120+
121+
onUnmounted(() => {
122+
document.body.removeEventListener("click", addBodyListener);
123+
});
124+
125+
return {
126+
show,
127+
data,
128+
optionsModel,
129+
count,
130+
onClick,
131+
toogleShow,
132+
};
133+
},
134+
});
135+
</script>
136+
137+
<style scoped>
138+
/* Animations */
139+
.fade-enter-active,
140+
.fade-leave-active {
141+
transition: opacity 0.1s;
142+
}
143+
.fade-enter,
144+
.fade-leave-to {
145+
opacity: 0;
146+
}
147+
148+
/* Slide-in-up animation*/
149+
.slide-in-up-enter-active,
150+
.slide-in-up-leave-active {
151+
transition: all 0.5s;
152+
transform: translateY(0);
153+
}
154+
.slide-in-up-enter,
155+
.slide-in-up-leave-to {
156+
opacity: 0;
157+
transform: translateY(20px);
158+
}
159+
160+
/* Slide-in-right animation*/
161+
.slide-in-right-enter-active,
162+
.slide-in-right-leave-active {
163+
transition: all 0.5s;
164+
transform: translateX(0);
165+
}
166+
.slide-in-right-enter,
167+
.slide-in-right-leave-to {
168+
opacity: 0;
169+
transform: translateX(20px);
170+
}
171+
172+
/* Slide-in-left animation*/
173+
.slide-in-left-enter-active,
174+
.slide-in-left-leave-active {
175+
transition: all 0.5s;
176+
transform: translateX(0);
177+
}
178+
.slide-in-left-enter,
179+
.slide-in-left-leave-to {
180+
opacity: 0;
181+
transform: translateX(-20px);
182+
}
183+
184+
/* Scale animation*/
185+
.scale-enter-active,
186+
.scale-leave-active {
187+
transition: all 0.5s;
188+
transform: scale(1);
189+
}
190+
.scale-enter,
191+
.scale-leave-to {
192+
opacity: 0;
193+
transform: scale(0);
194+
}
195+
196+
/* Rotate animation*/
197+
.rotate-enter-active,
198+
.rotate-leave-active {
199+
transition: all 0.5s;
200+
transform: scale(1) rotate(-360deg);
201+
}
202+
.rotate-enter,
203+
.rotate-leave-to {
204+
opacity: 0;
205+
transform: scale(0) rotate(360deg);
206+
}
207+
</style>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<template>
2+
<div class="tw-relative tw-rounded-lg tw-shadow-sm tw-text-gray-500">
3+
<div class="tw-pointer-events-none tw-absolute tw-inset-y-0 tw-left-0 tw-flex tw-items-center tw-pl-3">
4+
<slot name="icon">
5+
<i :class="icon"></i>
6+
</slot>
7+
</div>
8+
<input class="tw-block tw-w-full tw-rounded-md tw-border-0 tw-py-2 tw-pl-10
9+
tw-text-gray-900 tw-ring-1 tw-ring-inset tw-ring-gray-300
10+
placeholder:tw-text-gray-400 focus:tw-ring-2 focus:tw-ring-inset
11+
focus-visible:tw-outline-none
12+
sm:tw-text-sm sm:tw-leading-6" :placeholder="placeholder">
13+
</div>
14+
</template>
15+
<script>
16+
import { defineComponent } from 'vue';
17+
18+
export default defineComponent({
19+
props: {
20+
placeholder: {
21+
type: String,
22+
default: () => ""
23+
},
24+
icon: {
25+
type: String,
26+
default: () => ("fa-solid fa-magnifying-glass")
27+
}
28+
},
29+
setup(props, { emit }) {
30+
return {};
31+
}
32+
});
33+
</script>

0 commit comments

Comments
 (0)