Skip to content

Commit 2918f2a

Browse files
authored
Merge pull request #215 from fleetbase/feat/complete-maintenance-module
feat(maintenance): Complete maintenance module — Maintenances, Work Orders, Equipment & Parts
2 parents abb1d16 + d7a4fe0 commit 2918f2a

186 files changed

Lines changed: 9356 additions & 979 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<Layout::Resource::Card ...attributes as |Card|>
2+
<Card.header class="{{@headerClass}} truncate">
3+
<div class="font-semibold truncate">{{or @resource.name @resource.public_id}}</div>
4+
<div class="text-gray-300 dark:text-gray-500 text-sm truncate">{{or @resource.serial_number @resource.code @resource.public_id}}</div>
5+
{{#if (has-block "header")}}
6+
{{yield to="header"}}
7+
{{/if}}
8+
</Card.header>
9+
<Card.body class={{@bodyClass}}>
10+
<Image src={{@resource.photo_url}} @fallbackSrc={{config "defaultValues.equipmentImage"}} class="card-img-lg" />
11+
<div class="mt-2 space-y-1 text-xs text-gray-500 dark:text-gray-400">
12+
{{#if @resource.type}}
13+
<div class="flex items-center space-x-1">
14+
<FaIcon @icon="tag" @size="xs" class="text-gray-400" />
15+
<span>{{humanize @resource.type}}</span>
16+
</div>
17+
{{/if}}
18+
{{#if @resource.status}}
19+
<div class="flex items-center space-x-1">
20+
<FaIcon @icon="circle" @size="xs" class="text-gray-400" />
21+
<span>{{humanize @resource.status}}</span>
22+
</div>
23+
{{/if}}
24+
{{#if @resource.year}}
25+
<div class="flex items-center space-x-1">
26+
<FaIcon @icon="calendar" @size="xs" class="text-gray-400" />
27+
<span>{{@resource.year}}</span>
28+
</div>
29+
{{/if}}
30+
</div>
31+
{{#if (has-block "body")}}
32+
{{yield to="body"}}
33+
{{/if}}
34+
</Card.body>
35+
<Card.footer class={{@footerClass}}>
36+
<div class="flex flex-row items-center space-x-1">
37+
<Button @icon="eye" @size="xs" @onClick={{fn this.equipmentActions.transition.view @resource}} />
38+
<Button @icon="pencil" @size="xs" @onClick={{fn this.equipmentActions.transition.edit @resource}} />
39+
<Button @icon="trash" @size="xs" @type="danger" @onClick={{fn this.equipmentActions.delete @resource}} />
40+
</div>
41+
{{#if (has-block "footer")}}
42+
{{yield to="footer"}}
43+
{{/if}}
44+
<div class="mt-1">
45+
<div class="text-gray-300 dark:text-gray-500 text-xs">Last Modified: {{@resource.updatedAt}}</div>
46+
</div>
47+
</Card.footer>
48+
</Layout::Resource::Card>
49+
{{yield}}

addon/components/equipment/card.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import Component from '@glimmer/component';
2+
import { inject as service } from '@ember/service';
3+
4+
export default class EquipmentCardComponent extends Component {
5+
@service equipmentActions;
6+
}
Lines changed: 83 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,75 @@
1-
<div class="details-wrapper" ...attributes>
2-
<ContentPanel @title="Details" @open={{true}} @wrapperClass="bordered-top">
3-
<div class="grid grid-cols-1 lg:grid-cols-3 gap-2">
1+
<div class="next-content-panel-wrapper" ...attributes>
2+
3+
{{! ===== OVERVIEW ===== }}
4+
<ContentPanel @title="Overview" @open={{true}} @wrapperClass="bordered-top">
5+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-2 text-xs dark:text-gray-100">
6+
7+
{{! — Photo — }}
8+
{{#if (or @resource.photo_url (config "defaultValues.placeholderImage"))}}
9+
<div class="col-span-2 flex items-start gap-3 pb-2">
10+
<div class="border border-dashed border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-600 rounded-lg flex items-center justify-center w-16 h-16 flex-shrink-0">
11+
<Image
12+
alt={{@resource.name}}
13+
src={{or @resource.photo_url (config "defaultValues.placeholderImage")}}
14+
@fallbackSrc={{config "defaultValues.placeholderImage"}}
15+
class="w-12 h-12 object-contain"
16+
/>
17+
</div>
18+
<div>
19+
<p class="font-semibold text-sm text-gray-800 dark:text-gray-100">{{n-a @resource.name}}</p>
20+
<p class="text-[11px] text-gray-400 dark:text-gray-500 font-mono">{{n-a @resource.public_id}}</p>
21+
</div>
22+
</div>
23+
{{/if}}
24+
25+
{{! — Identity & Classification — }}
26+
<div class="col-span-2 text-[11px] uppercase tracking-wide text-gray-500 font-semibold mt-1">
27+
Identity & Classification
28+
</div>
429
<div class="field-info-container">
5-
<div class="field-name">Name</div>
6-
<div class="field-value">{{n-a @resource.name}}</div>
30+
<div class="field-name">ID</div>
31+
<ClickToCopy @value={{@resource.public_id}} class="field-value font-mono">{{n-a @resource.public_id}}</ClickToCopy>
732
</div>
8-
933
<div class="field-info-container">
1034
<div class="field-name">Code</div>
11-
<div class="field-value">{{n-a @resource.code}}</div>
35+
<ClickToCopy @value={{@resource.code}} class="field-value font-mono">{{n-a @resource.code}}</ClickToCopy>
36+
</div>
37+
<div class="field-info-container">
38+
<div class="field-name">Name</div>
39+
<div class="field-value">{{n-a @resource.name}}</div>
1240
</div>
13-
1441
<div class="field-info-container">
1542
<div class="field-name">Type</div>
16-
<div class="field-value">{{smart-humanize @resource.type}}</div>
43+
<div class="field-value">{{n-a (smart-humanize @resource.type)}}</div>
1744
</div>
18-
1945
<div class="field-info-container">
2046
<div class="field-name">Status</div>
2147
<div class="field-value">
2248
<Badge @status={{@resource.status}}>{{smart-humanize @resource.status}}</Badge>
2349
</div>
2450
</div>
25-
2651
<div class="field-info-container">
2752
<div class="field-name">Serial Number</div>
28-
<div class="field-value">{{n-a @resource.serial_number}}</div>
53+
<div class="field-value font-mono">{{n-a @resource.serial_number}}</div>
2954
</div>
3055

56+
{{! — Make & Model — }}
57+
<div class="col-span-2 text-[11px] uppercase tracking-wide text-gray-500 font-semibold mt-3">
58+
Make & Model
59+
</div>
3160
<div class="field-info-container">
3261
<div class="field-name">Manufacturer</div>
3362
<div class="field-value">{{n-a @resource.manufacturer}}</div>
3463
</div>
35-
3664
<div class="field-info-container">
3765
<div class="field-name">Model</div>
3866
<div class="field-value">{{n-a @resource.model}}</div>
3967
</div>
4068

41-
<div class="field-info-container">
42-
<div class="field-name">Purchased At</div>
43-
<div class="field-value">{{format-date @resource.purchased_at}}</div>
44-
</div>
45-
46-
<div class="field-info-container">
47-
<div class="field-name">Purchase Price</div>
48-
<div class="field-value">{{format-currency @resource.purchase_price}}</div>
69+
{{! — Assignment — }}
70+
<div class="col-span-2 text-[11px] uppercase tracking-wide text-gray-500 font-semibold mt-3">
71+
Assignment
4972
</div>
50-
51-
<div class="field-info-container">
52-
<div class="field-name">Warranty</div>
53-
<div class="field-value">{{n-a @resource.warranty_name}}</div>
54-
</div>
55-
56-
<div class="field-info-container">
57-
<div class="field-name">Equipped To</div>
58-
<div class="field-value">{{n-a @resource.equipped_to_name}}</div>
59-
</div>
60-
6173
<div class="field-info-container">
6274
<div class="field-name">Equipped Status</div>
6375
<div class="field-value">
@@ -68,28 +80,55 @@
6880
{{/if}}
6981
</div>
7082
</div>
83+
{{#if @resource.is_equipped}}
84+
<div class="field-info-container">
85+
<div class="field-name">Equipped To</div>
86+
<div class="field-value">{{n-a @resource.equipped_to_name}}</div>
87+
</div>
88+
{{/if}}
89+
</div>
90+
</ContentPanel>
7191

92+
{{! ===== FINANCIALS ===== }}
93+
<ContentPanel @title="Financials" @open={{true}} @wrapperClass="bordered-top">
94+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-2 text-xs dark:text-gray-100">
95+
<div class="field-info-container">
96+
<div class="field-name">Purchase Price</div>
97+
<div class="field-value">{{format-currency @resource.purchase_price @resource.currency}}</div>
98+
</div>
99+
<div class="field-info-container">
100+
<div class="field-name">Purchased At</div>
101+
<div class="field-value">{{n-a (format-date-fns @resource.purchased_at "dd MMM yyyy")}}</div>
102+
</div>
72103
<div class="field-info-container">
73104
<div class="field-name">Age</div>
74105
<div class="field-value">{{n-a @resource.age_in_days}} days</div>
75106
</div>
76-
77107
<div class="field-info-container">
78108
<div class="field-name">Depreciated Value</div>
79-
<div class="field-value">{{format-currency @resource.depreciated_value}}</div>
109+
<div class="field-value">{{format-currency @resource.depreciated_value @resource.currency}}</div>
110+
</div>
111+
<div class="field-info-container">
112+
<div class="field-name">Currency</div>
113+
<div class="field-value">{{n-a @resource.currency}}</div>
80114
</div>
81115
</div>
82116
</ContentPanel>
83117

84-
<CustomField::Yield @subject={{@resource}} @viewMode={{true}} @wrapperClass="bordered-top" />
85-
86-
<ContentPanel @title="Photo" @open={{true}} @wrapperClass="bordered-top">
87-
<div class="flex px-1">
88-
<div class="border border-dashed border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-600 rounded-lg flex items-center justify-center">
89-
<div class="flex items-center justify-center h-20 w-24">
90-
<Image alt={{@resource.name}} src={{or @resource.photo_url (config "defaultValues.equipmentImage")}} @fallbackSrc={{config "defaultValues.equipmentImage"}} class="w-12 h-12" />
118+
{{! ===== WARRANTY ===== }}
119+
{{#if @resource.warranty_name}}
120+
<ContentPanel @title="Warranty" @open={{true}} @wrapperClass="bordered-top">
121+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-2 text-xs dark:text-gray-100">
122+
<div class="field-info-container">
123+
<div class="field-name">Warranty</div>
124+
<div class="field-value">{{n-a @resource.warranty_name}}</div>
91125
</div>
92126
</div>
93-
</div>
94-
</ContentPanel>
95-
</div>
127+
</ContentPanel>
128+
{{/if}}
129+
130+
{{! ===== CUSTOM FIELDS ===== }}
131+
<CustomField::Yield @subject={{@resource}} @viewMode={{true}} @wrapperClass="bordered-top" />
132+
133+
<Spacer @height="200px" />
134+
</div>

0 commit comments

Comments
 (0)