From 258e27d2d79c497af19a1aa7b71925c3c56836c4 Mon Sep 17 00:00:00 2001 From: lawwman Date: Tue, 15 Nov 2022 12:27:00 +0800 Subject: [PATCH 1/2] ese coach --- .../__generated__/ese-coach.schema.d.ts | 34 +++ .../__generated__/ese-coach.schema.json | 62 +++++ .../ese-coach/__tests__/ese-coach.test.tsx | 30 ++ .../ese-coach/ese-coach.components.tsx | 37 +++ .../ese-coach/ese-coach.sample.ts | 23 ++ .../ese-coach/ese-coach.schema.ts | 66 +++++ .../ese-coach/ese-coach.template.tsx | 259 ++++++++++++++++++ .../ese-coach/ese-coach.types.ts | 5 + .../national-youth-council/ese-coach/index.ts | 9 + src/templates/national-youth-council/index.ts | 2 + 10 files changed, 527 insertions(+) create mode 100644 src/templates/national-youth-council/ese-coach/__generated__/ese-coach.schema.d.ts create mode 100644 src/templates/national-youth-council/ese-coach/__generated__/ese-coach.schema.json create mode 100644 src/templates/national-youth-council/ese-coach/__tests__/ese-coach.test.tsx create mode 100644 src/templates/national-youth-council/ese-coach/ese-coach.components.tsx create mode 100644 src/templates/national-youth-council/ese-coach/ese-coach.sample.ts create mode 100644 src/templates/national-youth-council/ese-coach/ese-coach.schema.ts create mode 100644 src/templates/national-youth-council/ese-coach/ese-coach.template.tsx create mode 100644 src/templates/national-youth-council/ese-coach/ese-coach.types.ts create mode 100644 src/templates/national-youth-council/ese-coach/index.ts diff --git a/src/templates/national-youth-council/ese-coach/__generated__/ese-coach.schema.d.ts b/src/templates/national-youth-council/ese-coach/__generated__/ese-coach.schema.d.ts new file mode 100644 index 00000000..e03bd84a --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/__generated__/ese-coach.schema.d.ts @@ -0,0 +1,34 @@ +/* tslint:disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export interface NationalYouthCouncilEseCoach { + name: string + /** + * Issuance date of the certificate + */ + courseEndDate: string + /** + * Course start date + */ + courseStartDate: string + /** + * Certificate number + */ + serialNumber: string + /** + * Name of the organisation representation + */ + organisationRepName: string + /** + * Title of the organisation representation + */ + organisationRepTitle: string + /** + * SHA256 hash of the organisation representation's signature + */ + organisationRepSignature: 'nicholas-signature&1e6ebedbff42703518a83c1b296744c55f071f9147ec19c8ebae88794ab3f120.png' +} diff --git a/src/templates/national-youth-council/ese-coach/__generated__/ese-coach.schema.json b/src/templates/national-youth-council/ese-coach/__generated__/ese-coach.schema.json new file mode 100644 index 00000000..1c97abfa --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/__generated__/ese-coach.schema.json @@ -0,0 +1,62 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "NationalYouthCouncil/EseCoach", + "type": "object", + "required": [ + "name", + "courseStartDate", + "courseEndDate", + "serialNumber", + "organisationRepSignature", + "organisationRepName", + "organisationRepTitle" + ], + "properties": { + "name": { + "type": "string", + "examples": ["John Wick"], + "minLength": 1 + }, + "courseEndDate": { + "type": "string", + "format": "date", + "description": "Issuance date of the certificate", + "examples": ["2022-12-31"] + }, + "courseStartDate": { + "type": "string", + "format": "date", + "description": "Course start date", + "examples": ["2022-11-30"] + }, + "serialNumber": { + "type": "string", + "description": "Certificate number", + "examples": ["OBSBCLS20XX/XXX"], + "minLength": 1 + }, + "organisationRepName": { + "type": "string", + "description": "Name of the organisation representation", + "examples": ["Nicholas Conceicao"], + "minLength": 1 + }, + "organisationRepTitle": { + "type": "string", + "description": "Title of the organisation representation", + "examples": ["Executive Director"], + "minLength": 1 + }, + "organisationRepSignature": { + "type": "string", + "description": "SHA256 hash of the organisation representation's signature", + "enum": [ + "nicholas-signature&1e6ebedbff42703518a83c1b296744c55f071f9147ec19c8ebae88794ab3f120.png" + ], + "examples": [ + "nicholas-signature&1e6ebedbff42703518a83c1b296744c55f071f9147ec19c8ebae88794ab3f120.png" + ] + } + }, + "additionalProperties": false +} diff --git a/src/templates/national-youth-council/ese-coach/__tests__/ese-coach.test.tsx b/src/templates/national-youth-council/ese-coach/__tests__/ese-coach.test.tsx new file mode 100644 index 00000000..2f457046 --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/__tests__/ese-coach.test.tsx @@ -0,0 +1,30 @@ +import * as React from 'react' +import renderer from 'react-test-renderer' +import { NationalYouthCouncilEseCoachTemplate } from '../ese-coach.template' +import { render, screen } from '@testing-library/react' +import { sample } from '../ese-coach.sample' + +describe('NationalYouthCouncilEseCoachTemplate', () => { + it('should match snapshot', () => { + const tree = renderer + .create( + void 0} + /> + ) + .toJSON() + + expect(tree).toMatchInlineSnapshot() + }) + + test('should render recipient name', () => { + render( + void 0} + /> + ) + expect(screen.getByText('John Doe')).toBeTruthy() + }) +}) diff --git a/src/templates/national-youth-council/ese-coach/ese-coach.components.tsx b/src/templates/national-youth-council/ese-coach/ese-coach.components.tsx new file mode 100644 index 00000000..4067efe7 --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/ese-coach.components.tsx @@ -0,0 +1,37 @@ +import { FlexBox } from 'components/flexbox' +import styled from 'styled-components' + +export const Root = styled(FlexBox)` + min-width: 500px; +` + +export const Table = styled.table` + width: 100%; + border: 1px solid black; + border-collapse: collapse; + font-family: 'Libre Franklin'; + font-size: 0.8em; + text-align: center; +` + +export const Header = styled.th` + border: 1px solid black; +` + +export const RowHeader = styled.td` + border: 1px solid black; + font-weight: bold; +` + +export const TableData = styled.td` + border: 1px solid black; + font-style: italic; + text-align: left; +` + +export const UnorderedList = styled.ul` + padding-left: 0px; + margin-left: 18px; + margin-top: 0px; + margin-bottom: 0px; +` diff --git a/src/templates/national-youth-council/ese-coach/ese-coach.sample.ts b/src/templates/national-youth-council/ese-coach/ese-coach.sample.ts new file mode 100644 index 00000000..851940ba --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/ese-coach.sample.ts @@ -0,0 +1,23 @@ +import { v2 } from '@govtechsg/open-attestation' +import { NationalYouthCouncilEseCoachOaDoc } from './ese-coach.types' + +export const sample: NationalYouthCouncilEseCoachOaDoc = { + $template: { + name: 'national-youth-council/ese-coach', + type: v2.TemplateType.EmbeddedRenderer, + url: 'http://localhost:3000', + }, + name: 'John Doe', + courseEndDate: '2022-12-31', + courseStartDate: '2022-11-30', + serialNumber: 'serial-number-1', + organisationRepName: 'Nicholas Conceicao', + organisationRepTitle: 'Executive Director', + organisationRepSignature: + 'nicholas-signature&1e6ebedbff42703518a83c1b296744c55f071f9147ec19c8ebae88794ab3f120.png', + issuers: [ + { + name: 'institute of blockchain', + }, + ], +} diff --git a/src/templates/national-youth-council/ese-coach/ese-coach.schema.ts b/src/templates/national-youth-council/ese-coach/ese-coach.schema.ts new file mode 100644 index 00000000..bb143b23 --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/ese-coach.schema.ts @@ -0,0 +1,66 @@ +import { JSONSchema } from 'json-schema-to-typescript' +import * as commonAssets from '../common/assets/__generated__/images-enum-values' + +export default { + $schema: 'http://json-schema.org/draft-07/schema#', + $id: 'NationalYouthCouncil/EseCoach', + type: 'object', + required: [ + 'name', + 'courseStartDate', + 'courseEndDate', + 'serialNumber', + 'organisationRepSignature', + 'organisationRepName', + 'organisationRepTitle', + ], + properties: { + name: { + type: 'string', + examples: ['John Wick'], + minLength: 1, + }, + courseEndDate: { + type: 'string', + format: 'date', + description: 'Issuance date of the certificate', + examples: ['2022-12-31'], + }, + courseStartDate: { + type: 'string', + format: 'date', + description: 'Course start date', + examples: ['2022-11-30'], + }, + serialNumber: { + type: 'string', + description: 'Certificate number', + examples: ['OBSBCLS20XX/XXX'], + minLength: 1, + }, + organisationRepName: { + type: 'string', + description: 'Name of the organisation representation', + examples: ['Nicholas Conceicao'], + minLength: 1, + }, + organisationRepTitle: { + type: 'string', + description: 'Title of the organisation representation', + examples: ['Executive Director'], + minLength: 1, + }, + organisationRepSignature: { + type: 'string', + description: + "SHA256 hash of the organisation representation's signature", + enum: commonAssets.getEnumValues([ + 'nicholas-signature&1e6ebedbff42703518a83c1b296744c55f071f9147ec19c8ebae88794ab3f120.png', + ]), + examples: commonAssets.getEnumValues([ + 'nicholas-signature&1e6ebedbff42703518a83c1b296744c55f071f9147ec19c8ebae88794ab3f120.png', + ]), + }, + }, + additionalProperties: false, +} as JSONSchema diff --git a/src/templates/national-youth-council/ese-coach/ese-coach.template.tsx b/src/templates/national-youth-council/ese-coach/ese-coach.template.tsx new file mode 100644 index 00000000..6edcfcec --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/ese-coach.template.tsx @@ -0,0 +1,259 @@ +import React, { FunctionComponent } from 'react' +import { TemplateProps } from '@govtechsg/decentralized-renderer-react-components' +import { NationalYouthCouncilEseCoachOaDoc } from './ese-coach.types' +import { Helmet } from 'react-helmet-async' +import { FlexBox } from 'components/flexbox' + +import { DateTime } from 'luxon' + +import { + Root, + Table, + Header, + TableData, + RowHeader, + UnorderedList, +} from './ese-coach.components' + +import { A4 } from 'components/paper-size' +import { ObsCertMainPage } from '../common/obs-cert-main-page/obs-cert-main-page' +import { Typography } from '../common/components' +import commonImagesMap from '../common/assets/__generated__/images-map' + +export const NationalYouthCouncilEseCoachTemplate: FunctionComponent< + TemplateProps & { className?: string } +> = ({ document, className = '' }) => { + const issueDate = DateTime.fromISO(document.courseEndDate).toFormat( + 'dd MMMM yyyy' + ) + const startMonth = DateTime.fromISO(document.courseStartDate).toFormat( + 'MMM yyyy' + ) + const endMonth = DateTime.fromISO(document.courseEndDate).toFormat( + 'MMM yyyy' + ) + + const tradeMarkSymbol = ( + TM + ) + + return ( + <> + + national-youth-council - ese-coach + + + + Certificate of Achievement + + } + signatures={[ + { + signatureSrc: + commonImagesMap[ + document.organisationRepSignature + ], + name: document.organisationRepName, + title: document.organisationRepTitle, + }, + ]} + > + + + This is to certify that + + + {document.name} + + + qualifies for the following award + + + Environment & Sustainability Education Coach +

+ at Outward Bound Singapore +
+ + On the date of + + + {issueDate} + + + Environment & Sustainability Education Developmental + Training:{' '} + {startMonth === endMonth + ? startMonth + : `${startMonth} - ${endMonth}`} + + + Certificate No.: {document.serialNumber} + +
+
+ + + + {document.name} + This table lists the operating systems and devices + used in the MOE OALCs that this certificate holder + has been trained to operate. + + + + +
+
Labrador OALC
+
Jalan Bahtera OALC
+
Dairy Farm OALC
+
Changi Coast OALC
+ + + Tower Circuit + + +
  • Edelrid - Smart Belay
  • +
  • Roperoller®
  • +
    +
    + + +
  • + ISC - SmartSnap{tradeMarkSymbol} +
  • +
  • Saferoller®
  • +
    +
    + + +
  • Edelrid - Smart Belay
  • +
  • Saferoller®
  • +
    +
    + + +
  • + ISC - SmartSnap{tradeMarkSymbol} +
  • +
  • Saferoller®
  • +
    +
    + + + Zipline + + +
  • Mini-Zip with Roperoller®
  • +
    +
    + + +
  • Traditional Zipline
  • +
  • Mini-Zip with Saferoller®
  • +
    +
    + + +
  • Mini-Zip with Saferoller®
  • +
    +
    + + +
  • Traditional Zipline
  • +
    +
    + + + Belay + + +
  • Traditional top rope belay
  • +
  • M-Belay (by pole friction)
  • +
    +
    + + +
  • Traditional top rope belay
  • +
    +
    + + +
  • Traditional top rope belay
  • +
    +
    + + +
  • Traditional top rope belay
  • +
    +
    + + + Abseil + + +
  • + Static abseil rig with back up + belay set up +
  • +
    +
    + + +
  • + Static abseil rig with back up + belay set up +
  • +
    +
    + + +
  • N.A
  • +
    +
    + + +
  • + Static abseil rig with back up + belay set up +
  • +
    +
    + + +
    + + + This certificate is only valid for purposes of + the abovementioned systems and devices at MOE + OALCs and does not grant the holder any form of + certification to operate or conduct activities + at any other premises. + + + This certificate shall remain valid for a period + of three (3) years from the date of this + certificate. + + + An expired certificate shall be deemed invalid. + + + Any person holding an expired certificate shall + be given three (3) months’ grace period from the + date of expiry to complete the recertification + process. + + +
    +
    +
    + + ) +} diff --git a/src/templates/national-youth-council/ese-coach/ese-coach.types.ts b/src/templates/national-youth-council/ese-coach/ese-coach.types.ts new file mode 100644 index 00000000..91d405a0 --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/ese-coach.types.ts @@ -0,0 +1,5 @@ +import { v2 } from '@govtechsg/open-attestation' +import { NationalYouthCouncilEseCoach } from './__generated__/ese-coach.schema' + +export type NationalYouthCouncilEseCoachOaDoc = NationalYouthCouncilEseCoach & + v2.OpenAttestationDocument diff --git a/src/templates/national-youth-council/ese-coach/index.ts b/src/templates/national-youth-council/ese-coach/index.ts new file mode 100644 index 00000000..43ef26bb --- /dev/null +++ b/src/templates/national-youth-council/ese-coach/index.ts @@ -0,0 +1,9 @@ +import { NationalYouthCouncilEseCoachTemplate } from './ese-coach.template' + +export const nationalYouthCouncilEseCoachTemplates = [ + { + id: 'nationalYouthCouncilEseCoach', + label: 'Certificate', + template: NationalYouthCouncilEseCoachTemplate, + }, +] diff --git a/src/templates/national-youth-council/index.ts b/src/templates/national-youth-council/index.ts index 9e7c92f3..7b666c47 100644 --- a/src/templates/national-youth-council/index.ts +++ b/src/templates/national-youth-council/index.ts @@ -1,4 +1,5 @@ import { TemplateRegistry } from '@govtechsg/decentralized-renderer-react-components' +import { nationalYouthCouncilEseCoachTemplates } from './ese-coach' import { nationalYouthCouncilSuccessfulCompletionTemplates } from './successful-completion' import { nationalYouthCouncilBitCampcraftAndNavigationTemplates } from './bit-campcraft-and-navigation' import { nationalYouthCouncilCrcLeadersTemplates } from './crc-leaders' @@ -18,6 +19,7 @@ import { nationalYouthCouncilStandardFirstAidTemplates } from './standard-first- import { nationalYouthCouncilBclsAedTemplates } from './bcls-aed' export const registry: TemplateRegistry = { + 'national-youth-council/ese-coach': nationalYouthCouncilEseCoachTemplates, 'national-youth-council/successful-completion': nationalYouthCouncilSuccessfulCompletionTemplates, 'national-youth-council/bit-campcraft-and-navigation': From 628354f7a1507e4924fad508ab3402f0a9932f31 Mon Sep 17 00:00:00 2001 From: lawwman Date: Tue, 15 Nov 2022 12:32:39 +0800 Subject: [PATCH 2/2] update test case --- .../ese-coach/__tests__/ese-coach.test.tsx | 693 +++++++++++++++++- 1 file changed, 692 insertions(+), 1 deletion(-) diff --git a/src/templates/national-youth-council/ese-coach/__tests__/ese-coach.test.tsx b/src/templates/national-youth-council/ese-coach/__tests__/ese-coach.test.tsx index 2f457046..0153047e 100644 --- a/src/templates/national-youth-council/ese-coach/__tests__/ese-coach.test.tsx +++ b/src/templates/national-youth-council/ese-coach/__tests__/ese-coach.test.tsx @@ -15,7 +15,698 @@ describe('NationalYouthCouncilEseCoachTemplate', () => { ) .toJSON() - expect(tree).toMatchInlineSnapshot() + expect(tree).toMatchInlineSnapshot(` + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: auto; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + } + + .c18 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + width: auto; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + } + + .c18 > *:not(:last-child) { + margin-bottom: 24px; + } + + .c1 { + min-width: 500px; + } + + .c20 { + width: 100%; + border: 1px solid black; + border-collapse: collapse; + font-family: 'Libre Franklin'; + font-size: 0.8em; + text-align: center; + } + + .c21 { + border: 1px solid black; + } + + .c22 { + border: 1px solid black; + font-weight: bold; + } + + .c23 { + border: 1px solid black; + font-style: italic; + text-align: left; + } + + .c24 { + padding-left: 0px; + margin-left: 18px; + margin-top: 0px; + margin-bottom: 0px; + } + + .c2 { + background: white; + position: relative; + width: 21cm; + min-height: 29.7cm; + padding: 2cm; + margin: 0 auto; + box-sizing: border-box; + border: 1px solid #ccc; + background-size: cover; + background-image: url('background.svg'); + z-index: initial; + } + + .c17 { + background: white; + position: relative; + width: 21cm; + min-height: 29.7cm; + padding: 2cm; + margin: 0 auto; + box-sizing: border-box; + border: 1px solid #ccc; + background-size: cover; + background-image: url('undefined'); + z-index: initial; + } + + .c13 { + display: block; + border-bottom: 1px solid #808041; + width: 100%; + max-width: 100%; + margin-top: 0px; + margin-bottom: 0px; + } + + .c4 { + font-size: 24px; + font-style: normal; + font-weight: 700; + text-align: center; + } + + .c7 { + font-size: 12px; + font-style: normal; + font-weight: 400; + margin-top: 0px; + } + + .c8 { + font-size: 16px; + font-style: normal; + font-weight: 700; + margin-top: 0px; + } + + .c9 { + font-size: 16px; + font-style: normal; + font-weight: 700; + margin-top: 0px; + text-align: center; + } + + .c10 { + font-size: 12px; + font-style: normal; + font-weight: 700; + margin-top: -8px; + } + + .c15 { + font-size: 12px; + font-style: normal; + font-weight: 400; + margin-top: 8px; + text-align: center; + } + + .c16 { + font-size: 12px; + font-style: normal; + font-weight: 700; + margin-top: -12px; + text-align: center; + } + + .c19 { + font-size: 12px; + font-style: normal; + font-weight: 700; + } + + .c25 { + font-size: 12px; + font-style: normal; + font-weight: 700; + margin-top: 16px; + margin-bottom: 16px; + } + + .c5 { + font-family: 'Libre Franklin'; + } + + .c12 { + width: 100%; + height: 100px; + background: url('nicholas-signature&1e6ebedbff42703518a83c1b296744c55f071f9147ec19c8ebae88794ab3f120.png'); + background-position: center; + background-size: contain; + background-repeat: no-repeat; + } + + .c14 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + color: #808041; + } + + .c3 { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + margin-top: 241px; + height: 90px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + } + + .c6 { + position: relative; + display: block; + height: 360px; + padding-top: 16px; + padding-bottom: 16px; + } + + .c11 { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + height: 214px; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-align-items: start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: start; + } + + @media print { + .c2 { + border: none; + -webkit-break-inside: avoid; + break-inside: avoid; + -webkit-break-before: always; + break-before: always; + } + } + + @media print { + .c17 { + border: none; + -webkit-break-inside: avoid; + break-inside: avoid; + -webkit-break-before: always; + break-before: always; + } + } + +
    +
    +
    +
    +

    + Certificate of Achievement +

    +
    +
    +
    +
    +

    + This is to certify that +

    +

    + John Doe +

    +

    + qualifies for the following award +

    +

    + Environment & Sustainability Education Coach +
    + at Outward Bound Singapore +

    +

    + On the date of +

    +

    + 31 December 2022 +

    +

    + Environment & Sustainability Education Developmental Training: + + Nov 2022 - Dec 2022 +

    +

    + Certificate No.: + serial-number-1 +

    +
    +
    +
    +
    +
    +
    +
    +
    +

    + + Nicholas Conceicao + + | Executive Director +

    +

    + Outward Bound Singapore +

    +
    +
    +
    +
    +
    +
    +

    + John Doe + This table lists the operating systems and devices used in the MOE OALCs that this certificate holder has been trained to operate. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Labrador OALC + + Jalan Bahtera OALC + + Dairy Farm OALC + + Changi Coast OALC +
    + Tower Circuit + +
      +
    • + Edelrid - Smart Belay +
    • +
    • + Roperoller® +
    • +
    +
    +
      +
    • + ISC - SmartSnap + + TM + +
    • +
    • + Saferoller® +
    • +
    +
    +
      +
    • + Edelrid - Smart Belay +
    • +
    • + Saferoller® +
    • +
    +
    +
      +
    • + ISC - SmartSnap + + TM + +
    • +
    • + Saferoller® +
    • +
    +
    + Zipline + +
      +
    • + Mini-Zip with Roperoller® +
    • +
    +
    +
      +
    • + Traditional Zipline +
    • +
    • + Mini-Zip with Saferoller® +
    • +
    +
    +
      +
    • + Mini-Zip with Saferoller® +
    • +
    +
    +
      +
    • + Traditional Zipline +
    • +
    +
    + Belay + +
      +
    • + Traditional top rope belay +
    • +
    • + M-Belay (by pole friction) +
    • +
    +
    +
      +
    • + Traditional top rope belay +
    • +
    +
    +
      +
    • + Traditional top rope belay +
    • +
    +
    +
      +
    • + Traditional top rope belay +
    • +
    +
    + Abseil + +
      +
    • + Static abseil rig with back up belay set up +
    • +
    +
    +
      +
    • + Static abseil rig with back up belay set up +
    • +
    +
    +
      +
    • + N.A +
    • +
    +
    +
      +
    • + Static abseil rig with back up belay set up +
    • +
    +
    +
      +
    • + This certificate is only valid for purposes of the abovementioned systems and devices at MOE OALCs and does not grant the holder any form of certification to operate or conduct activities at any other premises. +
    • +
    • + This certificate shall remain valid for a period of three (3) years from the date of this certificate. +
    • +
    • + An expired certificate shall be deemed invalid. +
    • +
    • + Any person holding an expired certificate shall be given three (3) months’ grace period from the date of expiry to complete the recertification process. +
    • +
    +
    +
    +
    + `) }) test('should render recipient name', () => {