<td>
{{ evseId != null ? `${evseId}/${connectorId}` : connectorId }}
</td>
- <td>
- {{ connector.status ?? EMPTY_VALUE_PLACEHOLDER }}
- </td>
<td>
{{ connector.locked === true ? 'Yes' : 'No' }}
</td>
{{ atgStatus?.start === true ? 'Yes' : 'No' }}
</td>
<td>
+ <select
+ v-model="selectedStatus"
+ class="connector-action-select"
+ :aria-label="`Set status for connector ${connectorId}`"
+ @change="applyConnectorStatus"
+ >
+ <option
+ v-for="s in statusOptions"
+ :key="s"
+ :value="s"
+ >
+ {{ s }}
+ </option>
+ </select>
+ <select
+ v-if="!isOCPP20x(ocppVersion)"
+ v-model="selectedErrorCode"
+ class="connector-action-select"
+ :aria-label="`Set error code for connector ${connectorId}`"
+ @change="applyConnectorStatus"
+ >
+ <option
+ v-for="e in errorCodeOptions"
+ :key="e"
+ :value="e"
+ >
+ {{ e }}
+ </option>
+ </select>
<StateButton
:active="connector.locked === true"
:off="() => unlockConnector()"
:on="() => startAutomaticTransactionGenerator()"
on-label="Start ATG"
/>
- <select
- v-model="selectedStatus"
- class="connector-status-select"
- :aria-label="`Set status for connector ${connectorId}`"
- @change="applyConnectorStatus"
- >
- <option
- v-for="s in statusOptions"
- :key="s"
- :value="s"
- >
- {{ s }}
- </option>
- </select>
- <select
- v-if="!isOCPP20x(ocppVersion)"
- v-model="selectedErrorCode"
- class="connector-status-select"
- :aria-label="`Set error code for connector ${connectorId}`"
- @change="applyConnectorStatus"
- >
- <option
- v-for="e in errorCodeOptions"
- :key="e"
- :value="e"
- >
- {{ e }}
- </option>
- </select>
</td>
</tr>
</template>
import { computed, ref, watch } from 'vue'
import { useRouter } from 'vue-router'
-import { EMPTY_VALUE_PLACEHOLDER, ROUTE_NAMES } from '@/core/index.js'
+import { ROUTE_NAMES } from '@/core/index.js'
import { useConnectorActions } from '@/shared/composables/useConnectorActions.js'
import Button from '../buttons/ClassicButton.vue'
setConnectorStatus(selectedStatus.value, undefined, errorCode)
}
</script>
+
+<style scoped>
+.connector-action-select {
+ display: block;
+ width: 100%;
+ text-align: center;
+ font-size: var(--font-size-sm);
+ cursor: pointer;
+}
+</style>
expect(cells[0].text()).toBe('1/3')
})
- it('should render connector status', () => {
- const wrapper = mountConnector({
- connectorOverrides: { status: OCPP16ChargePointStatus.CHARGING },
- })
- const cells = wrapper.findAll('td')
- expect(cells[1].text()).toBe('Charging')
- })
-
- it('should render placeholder when status is undefined', () => {
- const wrapper = mountConnector({
- connectorOverrides: { status: undefined },
- })
- const cells = wrapper.findAll('td')
- expect(cells[1].text()).toBe('Ø')
- })
-
it('should render "Yes" when locked', () => {
const wrapper = mountConnector({
connectorOverrides: { locked: true },
})
const cells = wrapper.findAll('td')
- expect(cells[2].text()).toBe('Yes')
+ expect(cells[1].text()).toBe('Yes')
})
it('should render "No" when not locked', () => {
connectorOverrides: { locked: false },
})
const cells = wrapper.findAll('td')
- expect(cells[2].text()).toBe('No')
+ expect(cells[1].text()).toBe('No')
})
it('should render transaction info when transaction is started', () => {
connectorOverrides: { transactionId: 42, transactionStarted: true },
})
const cells = wrapper.findAll('td')
- expect(cells[3].text()).toBe('Yes (42)')
+ expect(cells[2].text()).toBe('Yes (42)')
})
it('should render "No" when no transaction', () => {
connectorOverrides: { transactionStarted: false },
})
const cells = wrapper.findAll('td')
- expect(cells[3].text()).toBe('No')
+ expect(cells[2].text()).toBe('No')
})
it('should render ATG started "Yes" when atgStatus.start is true', () => {
const wrapper = mountConnector({ atgStatus: { start: true } })
const cells = wrapper.findAll('td')
- expect(cells[4].text()).toBe('Yes')
+ expect(cells[3].text()).toBe('Yes')
})
it('should render ATG started "No" when atgStatus is undefined', () => {
const wrapper = mountConnector({ atgStatus: undefined })
const cells = wrapper.findAll('td')
- expect(cells[4].text()).toBe('No')
+ expect(cells[3].text()).toBe('No')
})
})
it('should render OCPP 1.6 status options by default', () => {
const wrapper = mountConnector()
- const selects = wrapper.findAll('select.connector-status-select')
+ const selects = wrapper.findAll('select.connector-action-select')
const statusSelect = selects[0]
const options = statusSelect.findAll('option')
expect(options.length).toBe(Object.values(OCPP16ChargePointStatus).length)
it('should render OCPP 2.0.x status options for OCPP 2.0.1 station', () => {
const wrapper = mountConnector({ ocppVersion: OCPPVersion.VERSION_201 })
- const selects = wrapper.findAll('select.connector-status-select')
+ const selects = wrapper.findAll('select.connector-action-select')
const statusSelect = selects[0]
const options = statusSelect.findAll('option')
expect(options.length).toBe(Object.values(OCPP20ConnectorStatusEnumType).length)
it('should hide error code select for OCPP 2.0.x', () => {
const wrapper = mountConnector({ ocppVersion: OCPPVersion.VERSION_201 })
- const selects = wrapper.findAll('select.connector-status-select')
+ const selects = wrapper.findAll('select.connector-action-select')
expect(selects.length).toBe(1)
})
it('should show error code select for OCPP 1.6', () => {
const wrapper = mountConnector({ ocppVersion: OCPPVersion.VERSION_16 })
- const selects = wrapper.findAll('select.connector-status-select')
+ const selects = wrapper.findAll('select.connector-action-select')
expect(selects.length).toBe(2)
const errorOptions = selects[1].findAll('option')
expect(errorOptions.length).toBe(Object.values(OCPP16ChargePointErrorCode).length)
it('should call setConnectorStatus on status change', async () => {
const wrapper = mountConnector()
- const selects = wrapper.findAll('select.connector-status-select')
+ const selects = wrapper.findAll('select.connector-action-select')
await selects[0].setValue(OCPP16ChargePointStatus.FAULTED)
await flushPromises()
expect(mockClient.setConnectorStatus).toHaveBeenCalledWith(